diff --git a/Documentation/ABI/testing/sysfs-class-power b/Documentation/ABI/testing/sysfs-class-power index 27edc06e2495..9f3fd01a9373 100644 --- a/Documentation/ABI/testing/sysfs-class-power +++ b/Documentation/ABI/testing/sysfs-class-power @@ -189,7 +189,8 @@ Description: Access: Read Valid values: "Unknown", "Good", "Overheat", "Dead", "Over voltage", "Unspecified failure", "Cold", - "Watchdog timer expire", "Safety timer expire" + "Watchdog timer expire", "Safety timer expire", + "Over current", "Warm", "Cool", "Hot" What: /sys/class/power_supply//precharge_current Date: June 2017 diff --git a/Makefile b/Makefile index a35b848a075f..f9c9ad55d048 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 30 +SUBLEVEL = 31 EXTRAVERSION = NAME = Kleptomaniac Octopus @@ -880,7 +880,7 @@ LD_FLAGS_LTO_CLANG := -mllvm -import-instr-limit=5 KBUILD_LDFLAGS += $(LD_FLAGS_LTO_CLANG) KBUILD_LDFLAGS_MODULE += $(LD_FLAGS_LTO_CLANG) -KBUILD_LDS_MODULE += $(srctree)/scripts/module-lto.lds +KBUILD_LDS_MODULE += scripts/module-lto.lds endif ifdef CONFIG_LTO diff --git a/abi_gki_aarch64.xml b/abi_gki_aarch64.xml index 9323df2a9055..da2338089bd8 100644 --- a/abi_gki_aarch64.xml +++ b/abi_gki_aarch64.xml @@ -764,6 +764,7 @@ + @@ -1001,6 +1002,7 @@ + @@ -1041,6 +1043,7 @@ + @@ -1107,6 +1110,8 @@ + + @@ -1427,6 +1432,7 @@ + @@ -1828,6 +1834,7 @@ + @@ -2028,6 +2035,7 @@ + @@ -2153,7 +2161,6 @@ - @@ -2730,6 +2737,7 @@ + @@ -3340,6 +3348,7 @@ + @@ -3526,417 +3535,416 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - - + + - + - + - - - - + + + + - - + + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3945,85 +3953,85 @@ - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4032,51 +4040,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4086,9 +4094,9 @@ - + - + @@ -4096,28 +4104,28 @@ - + - + - + - + - + - + - + @@ -4225,7 +4233,7 @@ - + @@ -4237,512 +4245,501 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - - - + + + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + @@ -4759,439 +4756,439 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5200,160 +5197,160 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5373,150 +5370,150 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5528,364 +5525,364 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + @@ -5893,117 +5890,117 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + @@ -6011,233 +6008,233 @@ - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + @@ -6246,118 +6243,118 @@ - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -6372,13 +6369,13 @@ - + - + - + @@ -6386,18 +6383,18 @@ - - + + - - - + + + - + @@ -6406,62 +6403,62 @@ - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -6470,394 +6467,394 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - + - - + + - + - - - + + + - + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -6878,91 +6875,91 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -6977,280 +6974,280 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7259,49 +7256,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7310,683 +7307,683 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - - + + - + - + - - - - + + + + - + @@ -7995,87 +7992,87 @@ - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -8084,421 +8081,421 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -8507,365 +8504,362 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + + + + + + + - - - - - - - + - + - - + + - + - + - - - - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + @@ -8876,124 +8870,124 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + @@ -9001,35 +8995,35 @@ - + - + - + - + - + - - + + - + - - + + - + @@ -9038,174 +9032,174 @@ - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9219,8 +9213,8 @@ - - + + @@ -9231,300 +9225,300 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9533,265 +9527,265 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9799,437 +9793,437 @@ - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -10237,398 +10231,398 @@ - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + @@ -10636,51 +10630,51 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -10691,19 +10685,19 @@ - + - + - + - + - - + + @@ -10711,18 +10705,18 @@ - + - + - + - + - + @@ -10731,155 +10725,155 @@ - - + + - + - + - + - + - + - + - - - - - - + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -10888,1828 +10882,1827 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - + + + + - - - + + + - - + + - - - - - + + + + + + + + + + - - - + + - - - + + + - - - + + + - - - + + + + + + + + + + + - - - + + + + - - + + - - - - - - - - - + - - + - - - + + + - - - + + + + + + - - + + + + - + + + + - - + + - - - - + + + + - - + + - - - - + + - - + - - + + - + + + + - - + + + + - - - - + + - - - - + + + - - + + - - - + - - + + + - + + + + + - - - + + + - - - - - + - - - - - - - - - - - + + + + + + + + + + + + - - + + - - - + + - - + + + + + + - - + - - - - - - + + + + - + + + + + + + - - - - + + + + + + + - - - - - - - + + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - + + + - - + - - - + - + + - + + + - - + + + + + - - - + + + + + - - - - - + + + - - - - - + + + + - - - + + + + - - - - + + + + - - - - + + - - - - + + - - + + - + + - - + + - - + + - - + + - - - - + + + - + - - - + + + - + + + - - - + - - - + + - + + + + - + - - - - - - - - - + + - - + + + - - - + + + + + - + + - + + + - - + + - - - + + - - + + - - + + + - - + + - - - + + - - + + - - - - - - - + - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - - + + + + + - - - - - + - - - + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - + + - - - - - - - - + + + - - - + + + - - - - - - - + + - + - - - + + + + + + + + + + + + + - - - + - - - + + - + + + - - + + + - - - + + - - - + - - + + + + + + + - + + + + - - - - - - - + + + - - - - + + + + - - - + + + + + - - - - + + + + + - + + + - - - + + + - - - - - + + + + + + - - - - - - - + + + + + + + - - - - - - + + + + + + + - - - - - - - + + + + + - - - - - - - + + + - + + - - - + - - - + + + + + - - + + - + - - - - - + + + + + - - - - + + + + + + - - - - - - - - - - - - - - - - + - - - + + + + + + + + + + + + + + + + + - - - - - + + + - - - - + + - - - - - - - - + + + - - - + + + + + + + + - - + + + + + + - - - - + + + - - - - - - + + - - - + + - - - + + - - + + - - + + + + - - + + - - - + + + - - + + - - - + + - - + + + + - - + + - - - - + + + - - + + - - - + + - - + + - - + + - - + + + - - + + + - - - + + - - - + + + + + + + - - + + - - - - - - - + + + + - - + + - - - - + + + + - - + + - - - - + + + - - + + - - - + + + + - - + + + + + + + + - - - - + + + - - - - - - - - + + + - - - + + + - - - + + + - - - + + - - - + + - - + + - - + + - - + + + + - - + + - - - - + + + + - - + + - - - - + + + - - + + + - - - + + - - - + - - + + - + + + - - + + + + - - - + + - - - - + + - - - - - - - - - + @@ -12723,7 +12716,7 @@ - + @@ -12737,253 +12730,264 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + + + + + + - - + + - + - - + + @@ -12991,338 +12995,325 @@ - - - - - - - - - - - - - - - - - - - + + + + + + - + - + - - - + + + - - + + - - + + - + - + - + - + - - + + - - + + - - + + - - - - + + + + - - - - + + + + - + - - + + - + - - - + + + - + - + - + - + - + - + - - - + + + - - + + - - + + - - - + + + - + - - - + + + - - - - - - + + + + + + - - + + - - + + - - + + - - - + + + - - + + - + - - + + - - - - + + + + - - + + - - + + - + - - + + - - - + + + - - - + + + - + - - - - + + + + - - - + + + - - + + - - + + - - - - + + + + - - + + - - - - + + + + - - - + + + - - + + - - - + + + - + - - - + + + - + - + - - - - + + + + - + - - - - - - + + + + + + - + - + @@ -13331,7 +13322,7 @@ - + @@ -13340,139 +13331,139 @@ - - - + + + - + - - - - - + + + + + - - - - - - + + + + + + - - - - - + + + + + - + - - - + + + - - - + + + - + - + - - + + - - + + - - - - + + + + - - + + - - + + - - - - - + + + + + + + + + + - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -13480,633 +13471,637 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - + + + + + + + + - - - - - - + - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - + + - - - + + - - - - - - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - + - + - + - - + + - + - - + + - - + + - - - - - + + + + + - - - + + + - - + + - + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - + - + - + - + - - + + - + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - - - + + + - - + + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - - - - - + + + + + + + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + - - - - - + - - - - - - - - - - - - + + - - + + - + - + - - - + + + - + - + - - - - - - - + + + + + + + - - - + + + - + - + - - - + + + - - - - - + + + + + - + - + - - + + - - - - - - - - - + - - + + + + + + + + + + + + + + - + - + - + @@ -14115,790 +14110,790 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - - - - - - + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + - - + + - - - + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + - - - + + + - - - + + + + + + + + + + + + + + + + + + - - + + - + - + - + - + - + - + - + - - - - + + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - - - + + + - - + + - + - - - - - + + + + + - + - - + + - + - - + + - + - + - + - - + + - + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -14907,7 +14902,7 @@ - + @@ -14919,648 +14914,648 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -15569,7 +15564,7 @@ - + @@ -15578,161 +15573,161 @@ - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - - + + - + - - + + - + - - + + - + - + - + - - + + - + - + - + - + - + @@ -15806,12 +15801,12 @@ - + - + @@ -15838,10 +15833,10 @@ - + - + @@ -15867,16 +15862,16 @@ - + - + - + - - + + @@ -15892,21 +15887,21 @@ - + - + - + - + - + - + @@ -15914,13 +15909,13 @@ - + - + - + @@ -15929,59 +15924,59 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -15990,24 +15985,24 @@ - + - + - + - + - + - + - - + + @@ -16016,190 +16011,190 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -16237,7 +16232,7 @@ - + @@ -16245,7 +16240,7 @@ - + @@ -16283,7 +16278,7 @@ - + @@ -16297,7 +16292,7 @@ - + @@ -16308,7 +16303,7 @@ - + @@ -16328,7 +16323,7 @@ - + @@ -16336,7 +16331,7 @@ - + @@ -16365,7 +16360,7 @@ - + @@ -16376,15 +16371,15 @@ - + - + - - - + + + @@ -16412,39 +16407,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -16452,7 +16447,7 @@ - + @@ -16460,7 +16455,7 @@ - + @@ -16521,7 +16516,7 @@ - + @@ -16534,7 +16529,7 @@ - + @@ -16550,9 +16545,9 @@ - + - + @@ -16563,7 +16558,7 @@ - + @@ -16582,223 +16577,223 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -16818,7 +16813,7 @@ - + @@ -16836,7 +16831,7 @@ - + @@ -16850,7 +16845,7 @@ - + @@ -16861,10 +16856,10 @@ - + - + @@ -16881,7 +16876,7 @@ - + @@ -16952,7 +16947,7 @@ - + @@ -16981,7 +16976,7 @@ - + @@ -16995,7 +16990,7 @@ - + @@ -17009,17 +17004,17 @@ - + - - + + - + @@ -17027,10 +17022,10 @@ - + - + @@ -17041,30 +17036,30 @@ - + - + - + - + - + - + - + @@ -17073,90 +17068,90 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -17168,46 +17163,46 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -17216,35 +17211,35 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -17252,7 +17247,7 @@ - + @@ -17263,7 +17258,7 @@ - + @@ -17292,7 +17287,7 @@ - + @@ -17309,7 +17304,7 @@ - + @@ -17317,7 +17312,7 @@ - + @@ -17332,7 +17327,7 @@ - + @@ -17343,10 +17338,10 @@ - + - + @@ -17375,7 +17370,7 @@ - + @@ -17389,18 +17384,18 @@ - + - + - + - + - + @@ -17429,33 +17424,33 @@ - + - + - + - + - + - + - + - + @@ -17469,227 +17464,227 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -17697,2200 +17692,2200 @@ - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - + - + - + - - + + - - + + - - + + - - - + + + - - - + + + + + + + + + + + + + + + + + + - + + + - - + + + + - - - + + - - - + + + - - - - + + + + - - + + + + - - - + + + - - - - + + + - - - - + + + - - - + - - - + + - - - + + + - + + + + + - - + + + + + + + - - - + - - - - - + + + - - - - - - - + + - + + + - - - + + + + - - + + + + - - - + + + + + + - - - - + + - - - - + + + - - - - - - + + - - + + - - - - - - - + + + + + + + - + - - + + + - + - - + - + - - + - + - - - - - - + - - + + + + + + + + - - + + - - + + - - - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - + + - + + + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - + + - - + + - - - + + - - + + + - - + + + - - + + - - - + + + + - - - + + + + + - - + + - - - - + - - - - - + + + + + + - - + + - + + + + + - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - + + + + + + + + + + + + + + + + + - - + + + - - - + + + + - - - + + + + + + + - - - + + + + - - - - + + + - - - - - - - + + - - - - - - - - - + + - - + + - - + + + + + + + + + - - + + + + - - - + + - - - - + + + - - - - + + + - - + + + - - - + + + + - - - + + + - - - + + + + - - - - + + + + - - - + + + - - - - + + + - - - - + + + - - - + + + - - - + + + - - - + + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - - + + - - + + - - + + - + - - + + - - - - + + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - + - + - - - + + + - + - - + + - + - - + + - - + + - + - - - - - + + + + + - - - - - + + + + + - - + + - + - + - + - + - + - - - + + + - - + + - - - + + + - - + + - + - + - + - + - - - + + + - - + + - - + + - - - - - - + + + + + + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - - + + + + - + - + - - + + - - - - + + + + - - - - + + + + - + - + - + - + - + - + - - + + - + - + - - - + + + - - - + + + - - + + - - - - + + + + - + - + - + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - - + + + + - - - - - + + + + + - - + + - - + + - - - - - + + + + + - - + + - + - - + + - - - + + + - - - + + + - - + + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - - - + + + - + - - + + - + - + - + - + - - + + - - - - - + + + + + - - - - - + + + + + - - + + - - + + - - - - + + + + - + - - - + + + - - - + + + - - - - - + + + + + - - - - - - - + + + + + + + - - - - + + + + - - + + - - + + - - - + + + - - + + - + - - + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + + - - + - - + + - - - - + + + + - + - - + + - + - - + + - - + + - - + + - - - + + + - - + + - + - + - + - + - - - + + + - + - - + + - + - + - + - + - - + + - - - + + + - - - + + + - + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - - + + + + - - + + - - - - + + + + - - - - + + + + - - - + + + - - + + - + - - - + + + - - - + + + - - + + - - + + - + - + - - + + - - - + + + - - + + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -19899,78 +19894,78 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -19979,661 +19974,661 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + + + + - + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - - - - - - - + + + + + + + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + - - + + + + + + + + + + + + - + + - - - + + - - + - - - - - - + + - - - + + + + + + + + - - - - + + + - - + + - - - + + + - - - - - - - - - - - - - - + + + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -20645,260 +20640,260 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - - - - - - - - + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + @@ -20913,2429 +20908,2448 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - - - - - - - - - - + + + + + - - + + - + - - - - - - - + + + + + + + - - + + - - - - - - - + + + + + + + - - + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - - + + + + - - + + - - - - + + + + - - + + - - - - + + + + - + - + + + + + + + + + + + - + + + - - - + + + - - - + + + - - - + + + + - - - + + + - - - - + + + + + - - - - - - - - - - - + + + + + + - - - - - - - + - + + + + + + + - - - + + + + - - + + + + - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - - - + + + + - - + - - + + - - - + + + - - + + - - - + + + - - + + - + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - + + - - - + + + - - + + - + - - + + - + - - - + + + - + - - - + + + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - + - - + + - - - - + + + + - - + + - - - + + + - - - + + + - - - + + + - + - + - - + + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + + - - - + - + - - + + - - + + - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + - - - - - + + + + + - + - - + + - + - + - - + + - - + + - - - + + + - + - + - - - + + + - + - + - - - + + + - - - - + + + + - - + + - + - + - - - + + + - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - + + - - - - - - - + + + + + + + - - + + - - - - - - - - - - - + + + + + + + + + + + - - + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - + + + + - - + + - - - - + + + + - - + + - - - - + + + + + + + + + + + + + - + + - - - - - - - - - - - + + + + + + + + + + + + - - + + + + - - - - + + + + - - - - - + + - - - - + + + - - + + - - - - - - - - - - - - + + + - + - + - + - + - + + + - - - - - - + + + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - + - + - - + + - + - + - + - + - + - + - + - - - - + + + + - - - + + + - + - + - - - + + + - - + + - - - - + + + + - - - + + + - + - + - - - + + + - - - - + + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - + + - - + + - + - - - + + + - - - - - + + + + + - - - - + + + + - - + + + + + + + + + + + - + + + - - + - - - + + - - + + + - - - + + + + - - - + + + - - - - + + - - - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + - - - + + + - - + + - - + + - - - - + + + + - - - + + + - - - - + + + + - - + + - - + + - - - - + + + + - - + + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - - + + - + - + - + - + - + - + - + - - + + - - - - - + + + + + - - - + + + - + - + - - + + - - + + - - + + - - + + - + - - + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - + + - - - - - + + + + + - + - - - + + + - + - + - + - + - + - + - + - - - + + + - - - + + + - - + + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - - + + - - - + + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - - - + + + - - - - + + + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - - - + + + + - - + + - - + + - - - - - + + + + + - - + + - - - - - - + + + + + + - - - - + + + + - - - + + + - - - + + + - + - - + + - - - + + + - - - + + + - + - + - + - + @@ -23343,1147 +23357,1151 @@ - - - + + + - + - - - + + + - - - + + + - - - + + + - + - + - + - - + + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + + + + - - + + - - + + - + - - + + - - - + + + + + + + + + + + + + - - - - - - - - - - - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + + + + - + - - - + + + - - + + + + + + + + + + + - - - - - - - - - - - + + - - - - - + + + + + - - - + + + - - + + - - - - + + + + - - - + + + + + + + + - + - + - + - + - - + + - - - + + + - - - + + + - + - - + + - + - - - + + + - - - - - + + + + + - - + + - - - + + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - - + + - - + + - - - + + + - - + + - + - - + + - + - + - + - + - - + + - - - - + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - - + + - - + + - + - - + + - - - - + + + + - - + + - - - + + + - - + + - + - - - + + + - - + + - - - + + + - + - - - + + + - - + + - - + + - - - + + + - - + + - - - - + + + + - - + + - - - + + + - - - - + + + + - + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - - - - - - + + + + + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - - - - + + + + + - - + + - - - + + + - - + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - - - + + + + - - + + - - - + + + - - + + - + - - - + + + - - - - + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - - - - + + + + - - + + - + - + - + - + - - + + - - + + - - + + - - - + + + - + - - - - + + + + - + - - - - - - + + + + + + - - - + + + - - + + - + - + - + + - + - + - + - + - + - + - + - + - + - + @@ -24498,357 +24516,358 @@ - + - - - + + + + - - - - - - + + + + + + - - + + - - + + - - - - + + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - - + + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -24869,124 +24888,124 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -24994,44 +25013,44 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -25067,7 +25086,7 @@ - + @@ -25118,7 +25137,7 @@ - + @@ -25130,14 +25149,14 @@ - + - + - - + + @@ -25179,30 +25198,30 @@ - + - + - + - + - + - + - + - + - - + + @@ -25225,39 +25244,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -25266,81 +25285,81 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -25355,321 +25374,321 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -25681,132 +25700,132 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -25823,186 +25842,186 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -26011,13 +26030,13 @@ - + - + - + @@ -26026,166 +26045,166 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -26194,220 +26213,220 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -26415,151 +26434,151 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -26568,304 +26587,304 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -26873,9 +26892,9 @@ - + - + @@ -26893,82 +26912,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + @@ -26978,62 +26997,62 @@ - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -27048,63 +27067,63 @@ - + - + - + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + @@ -27112,82 +27131,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + @@ -27196,155 +27215,155 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + @@ -27358,261 +27377,261 @@ - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -27620,1387 +27639,1392 @@ - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - + + - - + + - - - + + + - - + + - + - - - + + + - - + + - - + + - + - + - - + + - - + + - - - - + + + + - - - + + + + + + + + - - - - - - - - - - - - - - - - - - + - - - + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + - - - - + + + + - - - - - - - - - + + + - - - + + - - - + + + - - + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + - - - + + - + - + + + + - + + - - - - + + + + - - + + + - - - - + + + - - - + + - - - + + + - - + - - - + + - + + + - - + + + + - - - + + - - - - + + + + - - + + + + + + - - - - + + + + + - - - - - - + + + + + + + - - - - - + + + + + - - - - - + + + + - - - - - + + + + + - - - - - - + + + - - + - - - - + + + + - - - + + + + + + - - - - + - - - - - - + + - + + + - - + + - - - + + + + - - + + + - - - - + + + + + - - - + + - - - - - + + - - + + - - + + - - + + + - - + - - - + + + - + + - - - + + + - - + + + - - - + + + + - - - + + + - - - - + + + + + + - - - + - - - - - - + + - + + - - + - - + + - + - - + + + + - + + + + + + + + + + + + - - - - + + - - - - - - - - - - - + - - + + + + - - + + + - - - - + + - - - - + + - - - + + + + - - + + + + - - - - + + + + + + - - - - + + + + + + + + + - - - - - - + + + + - - - - - - - - - + + + + - - - - + + - - - - - - - - + + + - - - + + + + + + - - + + - - + + + + - - + + + - - - - + + - - - + + - - + + + - - + + - - - + + + - - + + + - - - + + - - - + + + - - + + + - - - + + + - - - + + - - - + + + - - + + + + - - - + + + + - - - - + + + - - - - + + - - - + + - - + + + - - + + + - - - + + - - - + + + - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + - - - + + + - - - - + + + - - - + + + - - - + + - - - - - - - - - - + - + - + - + - + - - - - + + + + - - + + - - + + - - + + - - + + - - - - - - + + + + + + - - + + - - - - - - + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - + - - + + - - + + - - - + + + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - - - - - + + + + + - - - - - + + + + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - - - + + + + - + - - - + + + - + - - - + + + - - - - - + + + + + - - + + + + + + + - - + + - - + + - - + + - - + + - - - + + + - - + + - + - - + + - - - - + + + + - - + + - + - + - - - + + + - - - - - + + + + + - - + + - - + + - - + + - + - + - + - + - - + + - - - + + + - + - + - + @@ -29009,891 +29033,911 @@ - + - + - + - + - + - + - + - - + + - - - - + + + + - + - - + + - - + + - + - - - + + + - - - + + + - - - - + + + + - - - + + + - + - + - + - + - + - + - + - - - + + + - - - + + + - - - + + + - - - - + + + + - - + + - - - - + + + + - - + + - - + + - - + + - + + - - - - - + + + + - - + + - - - - + + + + - - + + - + - - - + + + - - - + + + - + - - + + - - + + - - + + - + - - + + - - - - + + + + - - + + - - - + + + - - + + - - + + - - - - - + + + + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - - - + + + + - - + + - - + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - + + + + + + + + + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - - - + + + - - + + - - - + + + - - - - + + + + - - + + - - - - - - + + + + + + + + - + - + - + - + - - + + + + - - - + + + - - + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - - + + + - - + + - - + + - + - - + + - + - + - - + + - - + + - - + + - - - - + + + + - - - - - - + + + + + + - - - - + + + + - - - - - + + + + + - + - - + + - - + + - - + + - - + + - - - + + + - - - - + + + + - - - + + + - - + + @@ -29902,89 +29946,89 @@ - - - - - + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - + + - - - - + + + + - - - + + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -29999,163 +30043,163 @@ - - - + + + - - + + - - + + - + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - + + - + - + - + - + - + - + - - - - - + + + + + - - - + + + - - - - - - + + + + + + - - + + - - - + + + - - + + - - - - + + + + - - - + + + - - - - - + + + + + - - + + - + - - + + - - + + - - - + + + - - + + - - + + @@ -30164,838 +30208,838 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - - - + + + - + - - - + + + - - - + + + - - - - + + + + - - - + + + - - + + - + - - - - - + + + + + - - + + - - - + + + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - + + + + + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - - + + - - - + + + - + - - + + - - + + - + - - + + - - + + - + - + - + - - + + - - - + + + - - - - - + + + + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - + + + - + - - - + + + - - - - - - - - - + + + + + + + + + - + + - - - - + + + - - - + + + - + - - + + - + - + - + - + - + - + - + - - + + - + - - - + + + - - + + - + - - + + - + - + - + - + - - + + - - - - - - + + + + + + - - - + + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - + - - - + + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -31004,39 +31048,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -31048,340 +31092,340 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -31392,354 +31436,354 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + - - + + - - - - + + + + - - - + + + - - + + - + - - - - - - - - - - + + + + + - - - - - - - + + - - + - - - + + - - + + - - - - - + + + - - - - + + - - + + + + + + - - - + + + - - + + - - - - - + + + - - + + - - - + + + + + + + + + + + + - - - - - - - + + - - - - + - - - + + + + - - + + + + + + + + + + + + + + - + - - + + - + - - - + + + - - - - + + + + - - + + - + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -31753,8 +31797,8 @@ - - + + @@ -31766,8 +31810,8 @@ - - + + @@ -31840,190 +31884,190 @@ - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - - - - + + + + + - - - + + + - - - - - - - - - - - - - - + + - - - + + + + + + + + + + + + + + + - + - + - + - + - - + + - + - - + + - - - + + + - + - - - + + + - - - - - + + + + + - + - - + + - - - + + + - + - + - + - + @@ -32032,288 +32076,300 @@ - + - + - + - + - + - - - + - + + + - - + + - + - + - - + + + + + + + - - - + + + - + - - - + + + - - + + - - - + + + - - + + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - - + + - - - - + + + + - + - - - - + + + + - - + + - - + + - - - - - + + + + + - + - - + + - - - + + + - - - - + + + + - - - + + + - - + + + + + + + + + - - + + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -32322,93 +32378,93 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -32417,68 +32473,68 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -32515,54 +32571,54 @@ - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - + + @@ -32570,93 +32626,93 @@ - - + + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -32664,275 +32720,275 @@ - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + - - + + - + - - + + - + - + - - + + - - - + + + - - - - - - - - - - - + - - - + + - - + + - - + + + - + + - - - - - - + + - - - - + - - - - - - - + + + + + + - - - - - - - + + + + - - - - - + + + + + + + - - - - - + + + + + + + - - + + + + - - - - - - - - + + + + + - - - + + + + + + - - + + + + + - - + + + - - + + - - + + - - - - + + - - - + + + - - + + + + + - - - - - + + + - - - - - - + + - - + + + + + + + + + + + + + + + + + - - + + - + - + - + - - + + @@ -32959,355 +33015,355 @@ - - - + + + - - - + + + - - - + + + - - + + - - + + - + - + - + - + - + - - + + - - + + - - - + + + - - + + - - + + - + - - - + + + - - + + - - + + - + - + - - - + + + - - - + + + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -33315,328 +33371,328 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -33645,600 +33701,600 @@ - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + - + - + - + - - + + - - + + - - + + - - - + + + - - - - - - - - - - - - + + - - - + - - + + + - - + + + - - + + - - - + + - - - + - - - + + + - + + + + - - + + + - - - - + - - - + + + + + + + + + - - - - - - - - - - + + + + - - + + + + + - - + + + - - - + + - - + + - - - - + + + - - - - - + + - - + + + + - - - + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - + + + - - + + - - + + - + - + - - - + + + - + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + - + - - + + - - - + + + - - - + + + - - + + - - - - + + + + - - + + - + - - - - + + + + - + - - + + - + - - - - + + + + - - - - - - + + + + + + - - + + - - - - + + + + - - + + - - + + - - - + + + - - + + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - + - + @@ -34250,58 +34306,58 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -34315,302 +34371,302 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - - + - - - - + + - + + + + + - + - + - - + + - + - + - - - + + + - - + + - - - - + + + + - - - - - - - - - - - + - - - - + + + - - + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - + + - + - + - - + + - - - + + + - - + + - + - + - - - - - - - - - - - - - - - - - + + + - - + + + + + + + + + + + + + + + + @@ -34620,73 +34676,73 @@ - + - - - + + + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - + + @@ -34697,86 +34753,86 @@ - + - + - + - + - + - - + + - - + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + @@ -34785,129 +34841,129 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -34915,21 +34971,21 @@ - + - + - + - + - + - + @@ -34949,7 +35005,7 @@ - + @@ -34969,7 +35025,7 @@ - + @@ -34986,48 +35042,48 @@ - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + @@ -35036,127 +35092,127 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -35164,703 +35220,702 @@ - - - - - - - - - + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - + + + - - - - + + + + - - - + + + + - - + + - + - + - - + + - + - - + + - - + + - + - - + + - - + + - - - - + + + + - - - - + + + + - + - - - - + + + + - - + + - - + + - - - - - + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + - + - - + + - - + + - + - - - - - - - - + + - + + - - - - + + + + - - - - - - - - - - + + + + + + + - + + + + - - - - - + + - - - - + + + + + + - - - - - + + + - - - - + + + + - - + + + + + - - + + + - - - + + + - - - + + + - - - - - + + + - - - + + + + - - + + + - - - + + - - - + + + - + - - + + - - - - - + + + - + - - - - + + + + - - + + + - + - - - + + + + - - + + + - - - + + - - - + + + - - - + + + - - - - - + + + - - - + + + + + + - - - - - + + + + + + + + + - - + + - - - + + + - - - - + + + + - - + + - - + + - - + + - - - - + + + + - - - - + + + + - - + + - - - - + + + + - - + + - - + + - - + + - - - + + + - - - - + + + + - + - - - + + + - - - + + + - + - + - - + + - - - - - + + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -35869,364 +35924,358 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - - - - - - - - - - - + + - + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + + + + - + - - - - - + + - - + + + + + - - - + + + - + - - - - - + + - + - + - + - + - + - + @@ -36259,10 +36308,10 @@ - + - + @@ -36288,7 +36337,7 @@ - + @@ -36311,24 +36360,24 @@ - + - + - + - + - - - + + + @@ -36348,16 +36397,16 @@ - + - + - + - + @@ -36369,16 +36418,16 @@ - + - - - - - + + + + + @@ -36389,205 +36438,204 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - + + + - + - - + + - + - - + + - + - + - + - + - - + + - - + + - + - + - + - - + + - - + + - - - + + + - + - - + + - + - - + + - + - + - + - + - - + + - - + + - + - + - + - + - - + + - + - - + + - - - + + + - - - + + + - - + + - - + + - - + + - + - + - + @@ -36597,36 +36645,36 @@ - + - + - + - + - + - + - - - + + + - + - - - + + + @@ -36640,35 +36688,35 @@ - + - + - + - + - + - + - + - + @@ -36677,22 +36725,22 @@ - + - + - + - + - + - + @@ -36731,7 +36779,7 @@ - + @@ -36745,7 +36793,7 @@ - + @@ -36754,56 +36802,56 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -36905,11 +36953,11 @@ - + - + @@ -36917,16 +36965,16 @@ - + - + - + - + @@ -36936,7 +36984,7 @@ - + @@ -36945,13 +36993,13 @@ - + - + - + @@ -36963,43 +37011,43 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -37007,45 +37055,45 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -37056,112 +37104,112 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -37170,53 +37218,53 @@ - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + @@ -37235,20 +37283,20 @@ - + - + - + - - - + + + - + @@ -37261,109 +37309,109 @@ - + - - + + - - + + - + - + - + - + - - - + + + - - + + - - + + - - + + - - - - - + + + + + - - - + + + - + - + - - - - + + + + - - + + - + - - - + + + - - - + + + - - + + - - - - + + + + - - + + - + - + @@ -37371,200 +37419,200 @@ - - + + - + - + - + - + - - - - - - + + + + + + - - + + - + - + - - + + - - - - + + + + - - - + + + - - - - + + + + - - + + - + - - + + - + - + - - + + - + - - + + - - + + - + - + - + - - - + + + - - - - + + + + - - + + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + + - + - + - - + + - - + + - - + + - + @@ -37576,22 +37624,22 @@ - + - + - + - + - + @@ -37619,31 +37667,31 @@ - + - + - + - + - + - + - + - + @@ -37657,7 +37705,7 @@ - + @@ -37667,38 +37715,38 @@ - + - + - + - + - + - + - - + + @@ -37708,7 +37756,7 @@ - + @@ -37723,155 +37771,155 @@ - + - + - + - + - + - - + + - - + + - + - - - - + + + + - - - + + + - - + + - - + + - - - + + + - - + + - + - - + + - + - - + + - - + + - - + + - + - + - - - + + + - - + + - + - - - - + + + + - - + + - + - + - + - + - + - + - + - + @@ -37880,7 +37928,7 @@ - + @@ -37898,7 +37946,7 @@ - + @@ -37917,7 +37965,7 @@ - + @@ -37937,7 +37985,7 @@ - + @@ -37955,43 +38003,43 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -38003,10 +38051,10 @@ - + - + @@ -38017,19 +38065,19 @@ - + - + - + - + @@ -38037,22 +38085,22 @@ - + - + - + - + - + - + @@ -38077,7 +38125,7 @@ - + @@ -38085,25 +38133,25 @@ - + - + - + - + - + - + @@ -38112,7 +38160,7 @@ - + @@ -38135,14 +38183,14 @@ - + - + - + @@ -38155,17 +38203,17 @@ - + - + - + @@ -38201,7 +38249,7 @@ - + @@ -38210,10 +38258,10 @@ - + - + @@ -38232,13 +38280,13 @@ - + - + - + @@ -38251,15 +38299,15 @@ - + - + - + @@ -38287,7 +38335,7 @@ - + @@ -38296,26 +38344,26 @@ - + - + - + - + - + - + - + @@ -38353,20 +38401,20 @@ - + - + - + - + @@ -38376,7 +38424,7 @@ - + @@ -38390,8 +38438,8 @@ - - + + @@ -38404,15 +38452,15 @@ - + - + - + @@ -38423,7 +38471,7 @@ - + @@ -38437,132 +38485,132 @@ - + - + - + - + - + - + - + - + - + - + - + - - - + + + - - + + - + - + - + - - - - - + + + + + - - - - + + + + - + - - - - + + + + - + - - + + - + - + - + @@ -38570,7 +38618,7 @@ - + @@ -38578,7 +38626,7 @@ - + @@ -38590,7 +38638,7 @@ - + @@ -38598,10 +38646,10 @@ - + - + @@ -38618,7 +38666,7 @@ - + @@ -38643,19 +38691,19 @@ - + - + - + - + @@ -38679,19 +38727,19 @@ - + - + - + - + @@ -38709,7 +38757,7 @@ - + @@ -38717,36 +38765,36 @@ - + - + - + - + - + - + - + - + - + - + @@ -38757,16 +38805,16 @@ - + - + - + @@ -38781,7 +38829,7 @@ - + @@ -38792,16 +38840,16 @@ - + - + - + - + @@ -38819,25 +38867,25 @@ - + - + - + - + - + - + @@ -38918,24 +38966,24 @@ - + - + - + - + - + - + @@ -38947,29 +38995,29 @@ - + - + - + - + - + - + - + @@ -39036,7 +39084,7 @@ - + @@ -39070,7 +39118,7 @@ - + @@ -39091,13 +39139,13 @@ - + - + - + @@ -39105,7 +39153,7 @@ - + @@ -39131,7 +39179,7 @@ - + @@ -39313,11 +39361,11 @@ - + - + @@ -39351,16 +39399,16 @@ - + - + - + - + @@ -39382,7 +39430,7 @@ - + @@ -39422,7 +39470,7 @@ - + @@ -39456,53 +39504,53 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -39588,13 +39636,13 @@ - + - + - + @@ -39602,10 +39650,10 @@ - + - + @@ -39628,7 +39676,7 @@ - + @@ -39657,7 +39705,7 @@ - + @@ -39683,7 +39731,7 @@ - + @@ -39697,7 +39745,7 @@ - + @@ -39717,7 +39765,7 @@ - + @@ -39734,7 +39782,7 @@ - + @@ -39818,7 +39866,7 @@ - + @@ -39826,14 +39874,14 @@ - + - + - + @@ -39859,7 +39907,7 @@ - + @@ -39870,14 +39918,14 @@ - + - + - + @@ -39885,10 +39933,10 @@ - + - + @@ -39902,7 +39950,7 @@ - + @@ -39910,7 +39958,7 @@ - + @@ -39927,16 +39975,16 @@ - + - + - + - + @@ -39958,7 +40006,7 @@ - + @@ -39967,7 +40015,7 @@ - + @@ -39977,7 +40025,7 @@ - + @@ -40346,10 +40394,10 @@ - + - + @@ -40375,13 +40423,13 @@ - + - + @@ -40538,7 +40586,7 @@ - + @@ -40637,7 +40685,7 @@ - + @@ -40666,13 +40714,13 @@ - + - + @@ -40697,15 +40745,15 @@ - + - + - + @@ -40725,7 +40773,7 @@ - + @@ -40748,7 +40796,7 @@ - + @@ -40759,7 +40807,7 @@ - + @@ -40792,7 +40840,7 @@ - + @@ -40814,7 +40862,7 @@ - + @@ -40843,7 +40891,7 @@ - + @@ -40872,19 +40920,19 @@ - + - + - + - + - + @@ -40904,16 +40952,16 @@ - + - + - + @@ -40928,7 +40976,7 @@ - + @@ -40939,7 +40987,7 @@ - + @@ -40953,7 +41001,7 @@ - + @@ -40983,16 +41031,16 @@ - + - + - + @@ -41001,7 +41049,7 @@ - + @@ -41020,10 +41068,10 @@ - + - + @@ -41031,7 +41079,7 @@ - + @@ -41048,7 +41096,7 @@ - + @@ -41108,7 +41156,7 @@ - + @@ -41149,7 +41197,7 @@ - + @@ -41181,7 +41229,7 @@ - + @@ -41228,7 +41276,7 @@ - + @@ -41248,7 +41296,7 @@ - + @@ -41524,7 +41572,7 @@ - + @@ -41604,14 +41652,14 @@ - + - + - + @@ -41619,304 +41667,304 @@ - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -41988,32 +42036,32 @@ - + - + - - + + - - + + - - - + + + @@ -42023,19 +42071,19 @@ - + - - + + - + @@ -42177,73 +42225,73 @@ - - + + - - - - - - + + + + + + - - - + + + - - - + + + - + - + - + - + - + - - - + + + - + - + - + - + @@ -42277,34 +42325,34 @@ - + - + - + - + - + - + - + - + @@ -42312,7 +42360,7 @@ - + @@ -42321,7 +42369,7 @@ - + @@ -42342,12 +42390,12 @@ - + - + @@ -42356,28 +42404,28 @@ - + - + - + - + - + @@ -42386,46 +42434,46 @@ - + - + - + - + - + - + - + - + - + - + @@ -42448,11 +42496,11 @@ - + - + @@ -42464,18 +42512,18 @@ - + - + - + @@ -42488,100 +42536,89 @@ - + - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -42589,55 +42626,55 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -42646,133 +42683,133 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -42786,27 +42823,27 @@ - + - + - + - + - + - + @@ -42815,7 +42852,7 @@ - + @@ -42850,10 +42887,10 @@ - + - + @@ -42879,7 +42916,7 @@ - + @@ -42908,7 +42945,7 @@ - + @@ -42949,22 +42986,22 @@ - + - + - + - + - + @@ -42984,22 +43021,22 @@ - + - + - + - + - + - + @@ -43007,7 +43044,7 @@ - + @@ -43018,7 +43055,7 @@ - + @@ -43033,25 +43070,25 @@ - + - + - + - + - + - + - + @@ -43063,19 +43100,19 @@ - + - + - + - + @@ -43087,21 +43124,21 @@ - + - + - + - + - + @@ -43121,21 +43158,21 @@ - + - + - + - + - + @@ -43146,42 +43183,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -43214,7 +43251,7 @@ - + @@ -43229,7 +43266,7 @@ - + @@ -43237,7 +43274,7 @@ - + @@ -43246,7 +43283,7 @@ - + @@ -43260,36 +43297,36 @@ - + - + - + - + - + - + - + - + - + @@ -43297,16 +43334,16 @@ - + - + - + @@ -43321,7 +43358,7 @@ - + @@ -43336,284 +43373,284 @@ - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -43624,109 +43661,109 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -43734,7 +43771,7 @@ - + @@ -43743,41 +43780,41 @@ - + - + - + - + - + - + - + - + - + - + @@ -43785,43 +43822,43 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -43832,67 +43869,67 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -43906,129 +43943,129 @@ - - - - + + + + + + + + + - - - + + + + - - - + - + - + + - + - - + + - + + + + - - - - - + + - - - - + + + + + + - - - - - - + + + - - + + + + - - - - + + - - + + + - - - + + - + + - - - + + - - + + + + + - - - - - + + + + + - - - - - + + + + + + - - - - - - - - - + - + - + @@ -44039,75 +44076,75 @@ - + - - + + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -44116,30 +44153,30 @@ - + - + - + - + - + - + - + - + - + @@ -44148,10 +44185,10 @@ - + - + @@ -44160,610 +44197,610 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - + + + + + - - - + + - - + + - + - + - + - + + + + + - + + + - - + + + + + + - - - - - - - + + - - + - + + - - + + - - + + + - - - - - + + + - - + + - - + + + - - - + + + - - - + + - - - - - - - - + + + + + + + + + + + + - - + + - + - + - + - + - + - - + + - - + + - - + + - + - + - + - + - - - - + + + + - + - - + + - - + + - - - + + + - - - - + + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -44778,364 +44815,367 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -45144,1309 +45184,1314 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - + + - - + + - - - + + + - - + + - - + + + + + + + - - - + + + - + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - - + + + + - + - + - + - + - - - + + + - - + + - + - + - - - + + + + + + + + + + + - - - - - + - + + - - + + - - + + - - + + - - - - + + + + + - - - - + + - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + - - - - - - - - + + - + - - - + + + - - + + - - - - - + + + + + - - + + - - + + - - + + - + - - + + - + - - + + - - + + - + - - - - - + + + + + - + - - + + - + - - + + - - - + + + - - - + + + - - + + - + - - - + + + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + + - - - - - + + + + - - + + - - + + - - + + - + - + - - + + - - - + + + - - - + + + - + - + - - - - + + + + - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - - - + + + + + - - - - + + + + - - - - - + + + + + - - + + - - + + - - + + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -46455,832 +46500,844 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - - - + + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - + + + + - - + + - - - + + + - - - + + + - - - + + + - + - + - - + + - - - + + + - - + + - - - + + + - - + + - - - - + + + + - + - - + + - + - + - + - + - - - + + + - + - + - - + + - - + + - + - + - - - + + + - - - - + + + - - - + + + + - - - - + + + - - - + + + + - - - - + + + - - - - + + + + - - - + + + + - - - + + + + + + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - + - + - - - - - - + + + + + + - + - - + + - - - - - - - - - - + + - - - - - - + + + + + + - - - - - + + + + + + - - - - + + + + + - - - + + + + - - - - + + + - - - - + + + + + + + + + + - - - + + + - - - + + + - - - - + + + + - - + + - + - - + + - - - - + + + + - + @@ -47291,7 +47348,7 @@ - + @@ -47318,7 +47375,7 @@ - + @@ -47333,140 +47390,140 @@ - + - + - + - + - + - + - - + + - - + + - + - - - - + + + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -47481,81 +47538,81 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -47564,219 +47621,219 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -47784,21 +47841,21 @@ - - + + - + - + - + - - + + @@ -47806,9 +47863,9 @@ - - - + + + @@ -47835,509 +47892,509 @@ - - - - + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - - - - - - + - + - - + + + + - - - + - - + + + - - + + - - - + + - - + + + - - + + - - + + - + - - + - - + - - + + + + - - - - - + + + + - - + + + + - - + + - - - - + + - - - + + + + - - - - + + + - - - - + + + + - - - + + + + + + + + + - - - - - + + + + + - - + + - + - - - + + + - + - + - + - - - - - - - - - - - - + + + + + + + + + + + + - + - + - - + + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -48346,19 +48403,19 @@ - + - + - + - + - + @@ -48367,13 +48424,13 @@ - + - + - + @@ -48382,31 +48439,31 @@ - + - + - + - + - + - + - + - + @@ -48415,40 +48472,40 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -48457,277 +48514,277 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + @@ -48735,59 +48792,59 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -48802,78 +48859,78 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -48888,189 +48945,189 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -49090,75 +49147,75 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -49167,410 +49224,410 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -49582,386 +49639,386 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -49989,8 +50046,8 @@ - - + + @@ -50016,142 +50073,142 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -50159,7 +50216,7 @@ - + @@ -50173,28 +50230,28 @@ - + - + - + - + - + - + - + - + - + @@ -50206,93 +50263,93 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -50309,252 +50366,252 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -50563,110 +50620,110 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -50681,15 +50738,15 @@ - + - + - + - + @@ -50701,16 +50758,16 @@ - + - + - + @@ -50736,58 +50793,58 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -50795,61 +50852,47 @@ - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - + - + - + - + - + @@ -50864,57 +50907,57 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -50923,46 +50966,46 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -50977,55 +51020,55 @@ - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -51051,63 +51094,63 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -51115,75 +51158,75 @@ - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -51212,371 +51255,371 @@ - - + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -51587,13 +51630,13 @@ - + - + - + @@ -51602,1323 +51645,1322 @@ - + - + - + - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - + - + - - + + - + - - - + + + - - + + - + - + - + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - - + + + + - - + + - - + + - - - - + + + + + + + + + - - + + + - - - + + - - + + + + + + - - - - - - + + - - + + - - + + + + + - - - - - + + + - - - + + + + - - - - + + + - - - + + + - - - - + + + + + + - - - - - - + + + + + + + + + - - - - - - - - + - + + + - - - + + + - - + + + - - - + + - - - + + + + + - - - - - + + + - - - + - + + - - + + - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + - - - - - - + - + + + + - - - - + - + + + - - - + + + - - - + + + - - - + - + + - + + + + - + - + - + - - - + - - - + + + - - - + + + + + + - - - + + + - - - - - - + + + - - - + + - - + + + - - - + + + - - - + + + - - - + + - - + - + + - + + + + - + - + - - - - - + + + - - - + + + + - - - + + - - + + + - - - - + + - - + + + + - - - - + + + - - - + + + + - - - - + - + + + + + - - - - - + + + + + - - - - - + - - - + + + + - - - - + + + - - - - - - + + - - - + + + - - - - - + + + + + + + + + + + - - - - - - - - + + + + + + + - - - + + + - - - + + - - + + + - - - + + + - - - + + - - + + - - + + + + + + - - - - - - + + + + + + - - - - - - + + - - - + + + - - - + + + + - - - + + + - - - + + + + - - - - + + - - + + + - - - + + + - - - + + + - - - + + + + + + - - - - - - - + + + + + + - - - - - - + + + - - + + + - - - + + + + - - - - + + - - + + + - - - - - - - - - - + + + + + - - - + + + - - - + + + + + + + - - + + - - + + - - + + + - - - + + + - - - + + + + - - - - + + + + - - - - + + + - - - + + + + + + - - - - - - + + + + + - - - - - + + + - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - + - - - + + + - - - + + + - - + + - - - + + + - + - + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -52947,27 +52989,27 @@ - + - + - + - + - + - + - + - + @@ -52979,7 +53021,7 @@ - + @@ -52993,7 +53035,7 @@ - + @@ -53005,7 +53047,7 @@ - + @@ -53019,10 +53061,10 @@ - + - + @@ -53030,13 +53072,13 @@ - + - + - + @@ -53062,28 +53104,28 @@ - - + + - + - + - + - + - + - + @@ -53107,26 +53149,26 @@ - + - + - + - + - + - + - + @@ -53134,112 +53176,112 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -53254,71 +53296,71 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -53329,8 +53371,8 @@ - - + + @@ -53339,54 +53381,54 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -53398,27 +53440,27 @@ - + - + - + - + - + - + - + - + @@ -53426,7 +53468,7 @@ - + @@ -53441,13 +53483,13 @@ - + - + - + @@ -53462,39 +53504,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -53502,13 +53544,13 @@ - + - + @@ -53519,10 +53561,10 @@ - + - + @@ -53536,7 +53578,7 @@ - + @@ -53545,10 +53587,10 @@ - + - + @@ -53562,19 +53604,19 @@ - + - + - + - + - + @@ -53591,7 +53633,7 @@ - + @@ -53602,30 +53644,30 @@ - + - + - + - + - + - + - + @@ -53633,7 +53675,7 @@ - + @@ -53651,165 +53693,165 @@ - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -53818,16 +53860,16 @@ - + - + - + - + @@ -53842,60 +53884,60 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + @@ -53909,26 +53951,26 @@ - + - + - + - + - + - + - - + + @@ -53936,474 +53978,474 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + - - - - - - + + + + + + + - - + + - - - + + + - + - - - + + + + - - - + + - - - + + + - + - + - - + + - + - - + + - + - - + + - - - - - - - - + + + + + + + + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - + - + - + - + - - + + - + - + - - - - - - + + + + + + - + - - + + - + - - + + - + - + - - - + + + - + - - - + + + - - - + + + - + - - - + + + - - - + + + - + - + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - + + + + + + - + + - - + + - - + + + - - - - - + + + + + + - - - - - + + - - + + - - - - - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -54411,46 +54453,46 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -54459,301 +54501,301 @@ - + - + - + - - + + + - - - - - - - - - + + + + + + + + - - + + - - + + - + - + - - + + - - + + - - + + - + - + - - + + - - + + - - - + + + - - + + - + - + - + - - + + - - + + - - - + + + - - + + - + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - + + - + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + + + + + - + + - - + + - - + + - - - + + + + - - - - - + + + - - + + + - - - + + + - - - - - - - + + - + - - - - + + + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + @@ -54765,105 +54807,105 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + + - - - - - - + + + + + + - - - - + + + - - + + - - + + + + + + + - - + - + + + + - - - - - - - - - - - - - + + + + + + - - + + - + @@ -54875,106 +54917,106 @@ - + - + - + - + - + - + - + - + - + - - - - + + + + - - + + - - - - - + + + + + - + - + - - - + + + - - + + - - - + + + - - + + - - + + - + - - - - + + + + - - - - + + + + - - + + - + - + @@ -54989,366 +55031,366 @@ - + - + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - + - - - + + + - + - - - + + + - + - + - - - - + + + + - - + + - - + + - - + + - + - + - + - - + + - + - - + + - - + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - - + + - - + + - - + + - - + + - - - - + + + + - - - - + + + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - - + + - - + + - - - + + + @@ -55356,66 +55398,66 @@ - - + + - - + + - + - - - + + + - - + + - - - + + + - - + + - - + + - + - - - - - + + + + + - + - + - - + + @@ -55423,23 +55465,23 @@ - + - + - + - + - + - + @@ -55448,49 +55490,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -55510,411 +55552,411 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - - + + @@ -55922,256 +55964,256 @@ - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - + + + + - - - - + + + + - - + + - + - + - + - - + + - - + + - + - + - + - - - + + + - - + + - + - - - + + + - + - + - + - + - + @@ -56187,1168 +56229,1139 @@ - - + + - + - + - + - + - - + + - - + + - - - + + + - - - - + + + + + + + + + + + - - - - + - + + - - + + + + - - - - + + + - - + + - - - + + + + + - - - - - + + + - - - + + + - - - + - + + + + - + - + - + + + - + - - - + + + - + - - - - - - + + + - - + + + + - - - - - - - + + + + + + - - - - - + + + - - - + + - - + + + + + + - - - - - + - - + + - - + + + + - - - - + + + + - - - - + + - - - - - + - + - - + + - - + + - - + + - - - - + + + + + + + + + - + + + + + + + + + + + + + + + + + + - + - + - + - - - - - + + + + + - - - + + + - + - + - - + + - + - - - + + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - - + + - - + + - + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - + - + - + - - + + - - - + + + - - + + - - + + - - + + - - + + - + - - + + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + + + + + + + - - - - + - + - - - + + + - - + + - + - - + + - - - - - + + + + + - - + + - + - - - - + + + + - - - + + + - - + + - - + + - + - + - - - - + + + + - + - + - + - + + + + + + + + + + + - - - + + + + + + - - - + + + - - - - - - - - - - - - - - - - + + + - - + + - - + + - + - - - - + + + + - + - + - + - + - + - + - - + + - - + + - - + + - - - + + + - - - + + + - - + + - - + + - + - + - + - - + + - + - - - + + + - - - + + + - - - - + + + + - - - - - + + + + + - - - - + + + + - - + + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -57375,169 +57388,169 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -57546,1073 +57559,1073 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + - - - - + + + + - - + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - + + - - + + - - - - - + + + + + - - + + - - - - - - - + + + + + + + - - - + + + - + - - + + - - - + + + - - - - + + + + + + + + + + + + + + + + + + + - - - + + + - + + + - - - + + + + + - - + + + - - - + + + - - - - - + + + - - - + - - - + + + + - - - + + + + - + + + - - - - - - - - - - - - - - - - - + + + + - - - - - + + + + + + + + + + + + + + + - - - + + + + - - - - - + + + + - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - + + + - - + + - + - + - + - + - + - + - + - + - - - - - - + + + + + + + + - - - - + + - - + + - + - - - + + + - - - + + + - + - - + + - - - - - - + + + + + + - - + + - - + + - - + + - - + + - - - + + + - - - - + + + + - - - - - + + + + + - - - + + + - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + - - - - - + + + + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - - + + - + - + - - - - - + + + + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + + + + - - + + - - + + - - + + - - - + + + - - + + - + - + - + - - + + - - - + + + - - - + + + - + - - - + + + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - - + + - + - + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - - - - + + + + - - - + + + - - - - + + + + - - - + + + - + + + + + + + + + + + + + + - + + + + + + + - - - - - - - - - + + + + - - - - - + + + - - - - - - + + + + - - - - - - - - - - - - - - + + + + - - - - + + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -58620,464 +58633,464 @@ - - - + + + - + - - - + + + - + - - - + + + - - + + - - + + - - - + + + - + - + - + - + - - + + - + - + - + - + - - + + - - + + - + - - + + - - + + - - - + + + - - + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -59101,76 +59114,76 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -59181,150 +59194,150 @@ - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + @@ -59333,324 +59346,324 @@ - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - + + + + + + + + + + + + + + + + + - - - + + - + + + - - + + + + - - + + - - - + + - - - - + + - - - - - - - - - - - - + + + - - - - + + - - - - - - + + - + - - - + + + - + - + - + - + - - + + - + - - + + - - + + - - + + - + - - + + - - - - + + + + - - + + - - - - + + + + - - - - + + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -59659,531 +59672,531 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + - - - + + + - - + + - - - + + + - - - - + + + + + + + + + + + + + + + + + + - - - + + + - + + + - - + + + - - + + + + - - - + + + + - - - + + + - - - - + + + + - - - - + + + - - - + + + + - - - - + + + + - - - + + + - - - - + + + + - - - - + + + + - - - + + + + - - - - + + - - - - + + - - - - + - - - - - - - - - - - - - - - - - + + + - + - + - + - + - + - - - - + + + + - - - + + + - - + + - - - + + + - + - - + + - - - + + + - - + + - - + + - - - + + + - - + + - - - - - + + + + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + @@ -60195,108 +60208,108 @@ - + - + - + - + - + - + - + - + - + - - + + - - - - - - - - + + + + + + + + - - - + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + @@ -60305,84 +60318,84 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -60411,154 +60424,154 @@ - + - + - + - + - + - + - + - + - + - - - - - + + + + + + + + - - - - - - - - + + + + + - - + + - - + + - - + + - - - + + + - - + + - + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - - - - - - - - - - - + + + - - - - - - - - + + - - - - - + + + + + - - - - + + + + - - + + - - - + + + - - + + - + - + - + - + @@ -60576,158 +60589,158 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - + - + - - + + - - - + + + - - + + - - - - - + + + + + - - - + + + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -60736,318 +60749,318 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -61056,209 +61069,209 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -61267,102 +61280,102 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -61371,49 +61384,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -61422,47 +61435,47 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -61470,102 +61483,102 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + @@ -61574,25 +61587,25 @@ - + - + - + - - + + - + - - + + @@ -61603,654 +61616,673 @@ - - - - - - - + + + + + + + + + + - - - + + + - - - - - - - + + - - - - - - - - - - + + + + + + + + + + + + - + - + - - + + - - - + + + - - - + + + - - + + - - + + - - + + + + + + + + + + + + + + + + - - + - - + + + + - - - - - - - - - - - - - - - - + - - - - + + + + + + + + + + + + + - - + + - - - + + + + + + + - - + + - - - - - - - - - - - - - - - + + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + + - - - - - - + + + + + - + - + - + - + - - - + + + - - + + - - - + + + - + - + - + - + + + + + + - - + + - - + + + - - - - - + + + + - - - - - - + - + - - + + - + - - - - + + + + - + - + - + - + - + - - + + - - - + + + - + - - + + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - + + + - - + + - + - + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -62259,282 +62291,282 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + @@ -62543,39 +62575,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -62587,61 +62619,61 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -62655,65 +62687,73 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + - + @@ -62777,35 +62817,35 @@ - + - + - + - + - + - + - + - + - + - + @@ -62821,14 +62861,14 @@ - + - + @@ -62839,28 +62879,28 @@ - + - + - + - + - + - + - + - + @@ -62898,22 +62938,22 @@ - + - + - + - + - + - - + + @@ -62922,16 +62962,16 @@ - + - + - + - + @@ -62940,15 +62980,15 @@ - + - + - + - + @@ -62995,31 +63035,31 @@ - + - + - + - + - + - + - + @@ -63028,7 +63068,7 @@ - + @@ -63036,41 +63076,41 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -63086,13 +63126,13 @@ - + - + - + @@ -63104,108 +63144,108 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + @@ -63228,9 +63268,9 @@ - + - + @@ -63238,21 +63278,21 @@ - + - + - + - + - + @@ -63260,20 +63300,20 @@ - + - + - + - + - + @@ -63285,7 +63325,7 @@ - + @@ -63299,7 +63339,7 @@ - + @@ -63326,7 +63366,7 @@ - + @@ -63339,22 +63379,22 @@ - - + + - + - - - - - - - + + + + + + + @@ -63368,18 +63408,18 @@ - - - + + + - - - - + + + + + - - - + + @@ -63387,83 +63427,83 @@ - + - + - + - - - - - + + + + + - - - - + + + + - - - + + + - - - + + + - + - + - + - + - - - + + + - - - - + + + + @@ -63476,36 +63516,36 @@ - + - + - - + + - - - + + + - + - + - - - - - + + + + + @@ -63531,8 +63571,8 @@ - - + + @@ -63542,86 +63582,86 @@ - - + + - + - + - + - + - + - - - + + + - + - - + + - - + + - - + + - + - + - + - + - + - + @@ -63638,7 +63678,7 @@ - + @@ -63646,31 +63686,31 @@ - + - - + + - + - + - + - + @@ -63679,7 +63719,7 @@ - + @@ -63690,58 +63730,58 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -63750,7 +63790,7 @@ - + @@ -63762,16 +63802,16 @@ - + - + - + - + @@ -63780,7 +63820,7 @@ - + @@ -63789,16 +63829,16 @@ - + - + - + - + @@ -63816,44 +63856,44 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -63861,7 +63901,7 @@ - + @@ -63869,156 +63909,156 @@ - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - - - + + + - + - + - + - + - - + + - - - + + + - + - - + + - - + + - + - - + + - - - + + + - - - + + + - - + + - + - + - + - + - + - + - + @@ -64035,43 +64075,43 @@ - - + + - - - + + + - + - + - + - - - + + + - + - + - + @@ -64090,57 +64130,57 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -64151,10 +64191,10 @@ - + - + @@ -64162,10 +64202,10 @@ - + - + @@ -64173,16 +64213,16 @@ - + - + - + - + @@ -64190,7 +64230,7 @@ - + @@ -64209,69 +64249,69 @@ - + - + - + - - + + - - + + - - + + - - - - + + + + - - + + - - + + - + - + - - + + - + - + - + @@ -64290,38 +64330,38 @@ - + - - - - + + + + - + - + - + - + - + @@ -64335,7 +64375,7 @@ - + @@ -64354,52 +64394,52 @@ - - + + - - - + + + - - - + + + - - + + - + - - - + + + - - - + + + - - + + @@ -64408,35 +64448,35 @@ - + - + - - + + - - - - - + + + + + - - - - - + + + + + @@ -64445,38 +64485,38 @@ - + - + - - + + - + - - - + + + - - - - + + + + - + @@ -64488,53 +64528,53 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -64553,42 +64593,42 @@ - + - + - + - + - + - + - + - + - + - + @@ -64638,46 +64678,46 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -64688,45 +64728,45 @@ - + - + - + - + - + - - + + - + - + - + - + - + - + @@ -64734,7 +64774,7 @@ - + @@ -64763,47 +64803,47 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + @@ -64825,152 +64865,152 @@ - + - + - + - - - + + + - + - + - + - - + + - - + + - - + + - - + + - - - - + + + + - - + + - - + + - - + + - + - - - - + + + + - - - + + + - - + + - - + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - + + - + - + - - - + + + - + - - + + - - - + + + - - - - + + + + @@ -64978,47 +65018,47 @@ - + - + - + - + - + - + - + - + - + - - - + + + - - + + @@ -65033,7 +65073,7 @@ - + @@ -65041,53 +65081,53 @@ - - + + - + - - + + - - - + + + - - + + - - + + - + - - - - + + + + - - - + + + - - - - + + + + @@ -65096,13 +65136,13 @@ - + - + - + @@ -65114,13 +65154,13 @@ - + - + @@ -65147,10 +65187,10 @@ - + - + @@ -65162,22 +65202,22 @@ - + - + - + - + - + - + @@ -65185,10 +65225,10 @@ - + - + @@ -65243,34 +65283,34 @@ - + - + - + - + - + - + - + - + - + @@ -65294,19 +65334,19 @@ - + - + - + @@ -65315,10 +65355,10 @@ - + - + @@ -65327,22 +65367,22 @@ - + - + - + - + - + - + @@ -65362,7 +65402,7 @@ - + @@ -65370,7 +65410,7 @@ - + @@ -65382,16 +65422,16 @@ - + - + - + - + @@ -65420,7 +65460,7 @@ - + @@ -65465,175 +65505,175 @@ - + - + - + - + - + - + - - + + - + - + - + - - - + + + - - + + - - - + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - - - + + + - + - + - + - + - + - - + + @@ -65641,13 +65681,13 @@ - - + + - + @@ -65659,9 +65699,9 @@ - + - + @@ -65700,7 +65740,7 @@ - + @@ -65718,7 +65758,7 @@ - + @@ -65733,13 +65773,13 @@ - + - + - + @@ -65753,13 +65793,13 @@ - + - + @@ -65768,10 +65808,10 @@ - + - + @@ -65792,37 +65832,37 @@ - - + + - + - - + + - - + + - + - - + + @@ -65888,7 +65928,7 @@ - + @@ -65899,10 +65939,10 @@ - + - + @@ -65920,25 +65960,25 @@ - + - + - + - + - + - + - + @@ -65950,16 +65990,16 @@ - + - + - + - + @@ -65968,28 +66008,28 @@ - + - + - + - + - + - + - + @@ -65998,40 +66038,40 @@ - + - + - + - + - + - + - + - + - + - + @@ -66042,19 +66082,19 @@ - + - + - + - + @@ -66066,22 +66106,22 @@ - + - + - + - + - + @@ -66096,33 +66136,33 @@ - + - + - + - + - + - + - + - + - + @@ -66151,9 +66191,9 @@ - - - + + + @@ -66171,7 +66211,7 @@ - + @@ -66180,46 +66220,46 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -66227,22 +66267,22 @@ - + - + - + - + - + @@ -66271,7 +66311,7 @@ - + @@ -66279,7 +66319,7 @@ - + @@ -66408,35 +66448,35 @@ - + - + - + - + - + - + - + - + @@ -66444,16 +66484,16 @@ - + - + - + - + @@ -66464,15 +66504,15 @@ - - + + - + @@ -66540,9 +66580,9 @@ - - - + + + @@ -66556,27 +66596,27 @@ - + - + - + - - - + + + @@ -66601,19 +66641,19 @@ - + - - + + - - + + @@ -66623,109 +66663,109 @@ - - - + + + - + - - - + + + - - - - + + + + - - - - + + + + - + - + - + - + - + - + - + - - + + - + - + - - + + - - + + - + - - - + + + - + @@ -66737,18 +66777,18 @@ - + - + - + - + @@ -66793,7 +66833,7 @@ - + @@ -66808,7 +66848,7 @@ - + @@ -66837,18 +66877,18 @@ - + - + - - + + - - + + @@ -66857,43 +66897,43 @@ - + - + - - + + - - - + + + - + - - + + - - + + - - + + @@ -66907,7 +66947,7 @@ - + @@ -66916,8 +66956,8 @@ - - + + @@ -66927,8 +66967,8 @@ - - + + @@ -66937,38 +66977,38 @@ - - + + - - + + - + - - + + - - + + - + - - + + @@ -66979,11 +67019,11 @@ - + - + @@ -66991,11 +67031,11 @@ - + - + @@ -67004,64 +67044,64 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -67079,21 +67119,21 @@ - + - + - + - + - + @@ -67147,34 +67187,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -67186,10 +67226,10 @@ - + - + @@ -67201,52 +67241,52 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -67255,7 +67295,7 @@ - + @@ -67303,17 +67343,17 @@ - + - + - + @@ -67378,7 +67418,7 @@ - + @@ -67387,23 +67427,23 @@ - + - + - + - - + + @@ -67483,13 +67523,13 @@ - + - + - + @@ -67498,22 +67538,22 @@ - + - + - + - + - + - + @@ -67522,27 +67562,27 @@ - + - + - + - + - + - + - + @@ -67557,7 +67597,7 @@ - + @@ -67569,39 +67609,39 @@ - + - + - + - + - + - + - + - + - + - + @@ -67619,25 +67659,25 @@ - + - + - + - + - + - + - + @@ -67708,7 +67748,7 @@ - + @@ -67717,26 +67757,26 @@ - + - + - + - + - - + + - + - + @@ -67746,7 +67786,7 @@ - + @@ -67759,10 +67799,10 @@ - + - + @@ -67777,15 +67817,15 @@ - + - + - + @@ -67795,18 +67835,18 @@ - + - + - + @@ -67814,37 +67854,37 @@ - + - + - + - + - + - + - + - + - + @@ -67853,31 +67893,31 @@ - + - + - + - + - + - + - + - + @@ -67885,16 +67925,16 @@ - + - + - + - + @@ -67902,10 +67942,10 @@ - + - + @@ -67914,26 +67954,26 @@ - + - + - + - + - + - + - + @@ -67945,7 +67985,7 @@ - + @@ -67959,37 +67999,37 @@ - + - + - + - + - + - + - + - + @@ -68002,20 +68042,20 @@ - + - + - + - - + + @@ -68026,7 +68066,7 @@ - + @@ -68039,12 +68079,12 @@ - + - + - + @@ -68077,7 +68117,7 @@ - + @@ -68096,30 +68136,30 @@ - - + + - - + + - + - - + + - + - + @@ -68127,117 +68167,117 @@ - + - + - + - - - - - - + + + + + + - - + + - - - - - - - - + + + + + + + + - - - - + + + + - - + + - + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - - - - - + + + + + + + - - + + - - - + + + - - - - - - + + + + + + - - - - + + + + - - + + - + + - - - + + - - - + + + - + @@ -68257,19 +68297,19 @@ - + - + - + - + @@ -68298,156 +68338,156 @@ - - + + - + - - - + + + - + - + - + - - - + + + - - - + + + - - - + + + - - + + - + - + - + - + - + - + - + - + - - + + - - - + + + - - - - + + + + - + - + - + - + - + - + - - - + + + - + - + - + @@ -68470,83 +68510,83 @@ - - + + - - + + - + - + - - + + - - + + - - + + - - - + + + - + - + - + - + - + - + - - + + - - + + - - + + - - - + + + - - - + + + @@ -68558,16 +68598,16 @@ - + - - - - - - + + + + + + @@ -68580,11 +68620,11 @@ - + - - + + @@ -68602,82 +68642,82 @@ - - - - - - + + + + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - - - + + + + + + - + - + - + - - - + + + - - + + - - - - - + + + + + - - + + - - - - - + + + + + @@ -68685,87 +68725,87 @@ - + - - - - - - + + + + + + - - - + + + - - + + - - + + - - - - - - - + + + + + + + - - - - + + + + - + - - - - + + + + - + - - + + - - - + + + - + - + @@ -68775,37 +68815,37 @@ - + - + - + - - - - - - + + + + + + - + - + - + - + @@ -68814,23 +68854,23 @@ - - + + - - - + + + - + - + @@ -68845,7 +68885,7 @@ - + @@ -68856,47 +68896,47 @@ - + - - + + - - - + + + - + - + - + - - + + - + - - + + @@ -68907,17 +68947,17 @@ - + - + - + @@ -68925,10 +68965,10 @@ - + - + @@ -68937,13 +68977,13 @@ - + - + - + @@ -68963,54 +69003,54 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -69018,7 +69058,7 @@ - + @@ -69026,13 +69066,13 @@ - + - + - + @@ -69043,7 +69083,7 @@ - + @@ -69060,39 +69100,39 @@ - - + + - + - + - + - + - + - + @@ -69109,131 +69149,131 @@ - + - - - + + + - + - - + + - - + + - + - - + + - - + + - + - - - - + + + + - - + + - - + + - + - - - - - + + + + + - + - - - + + + - - - + + + - - + + - - - + + + - + - - + + - - + + - - + + - + - + - + @@ -69241,119 +69281,119 @@ - - + + - - - + + + - + - + - + - + - + - + - + - + - - + + - + - - + + - - + + - - + + - - + + - + - - + + - - + + - - - + + + - + - - - + + + - - + + - + - + @@ -69362,13 +69402,13 @@ - + - + - + @@ -69383,7 +69423,7 @@ - + @@ -69430,7 +69470,7 @@ - + @@ -69461,7 +69501,7 @@ - + @@ -69509,7 +69549,7 @@ - + @@ -69549,13 +69589,13 @@ - + - + - + @@ -69572,10 +69612,10 @@ - + - + @@ -69589,7 +69629,7 @@ - + @@ -69623,7 +69663,7 @@ - + @@ -69637,7 +69677,7 @@ - + @@ -69654,10 +69694,10 @@ - + - + @@ -69666,7 +69706,7 @@ - + @@ -69683,16 +69723,16 @@ - + - + - + @@ -69711,44 +69751,44 @@ - + - - - + + + - - - - + + + + - - + + - + - - + + - - + + - - + + @@ -69761,13 +69801,13 @@ - + - + - + @@ -69776,16 +69816,16 @@ - + - + - + - + @@ -69797,61 +69837,61 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -69860,10 +69900,10 @@ - + - + @@ -69881,30 +69921,30 @@ - + - + - + - + - + - + - + - + @@ -70033,20 +70073,20 @@ - + - + - + - + - + @@ -70054,13 +70094,13 @@ - + - + - + @@ -70072,13 +70112,13 @@ - + - + @@ -70087,13 +70127,13 @@ - + - + - + @@ -70105,19 +70145,19 @@ - + - + - + - + - + @@ -70148,13 +70188,13 @@ - + - + @@ -70163,16 +70203,16 @@ - + - + - + @@ -70205,7 +70245,7 @@ - + @@ -70213,65 +70253,65 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -70308,7 +70348,7 @@ - + @@ -70321,13 +70361,13 @@ - + - + @@ -70336,38 +70376,38 @@ - - + + - + - - - - + + + + - - + + - - + + - - + + - - + + - + @@ -70376,8 +70416,8 @@ - - + + @@ -70397,85 +70437,85 @@ - + - + - - - + + + - + - + - + - - + + - + - + - + - - + + - + - - + + - + - - - + + + - - - + + + @@ -70484,12 +70524,12 @@ - + - + @@ -70503,7 +70543,7 @@ - + @@ -70513,66 +70553,66 @@ - + - + - - + + - + - + - + - + - + - - + + - - + + - - + + - + - + @@ -70582,7 +70622,7 @@ - + @@ -70595,12 +70635,12 @@ - - + + - + @@ -70609,24 +70649,24 @@ - - + + - + - + - + @@ -70634,18 +70674,18 @@ - + - - + + - + @@ -70657,7 +70697,7 @@ - + @@ -70672,13 +70712,13 @@ - + - + @@ -70690,16 +70730,16 @@ - + - + - + @@ -70711,22 +70751,22 @@ - + - + - + - + - + @@ -70734,22 +70774,22 @@ - + - + - + - + - + @@ -70758,25 +70798,25 @@ - + - + - + - + - + - + @@ -70787,10 +70827,10 @@ - + - + @@ -70799,7 +70839,7 @@ - + @@ -70807,16 +70847,16 @@ - + - + - + - + @@ -70824,7 +70864,7 @@ - + @@ -70876,7 +70916,7 @@ - + @@ -70891,22 +70931,22 @@ - + - + - + - + - + - + @@ -70917,50 +70957,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -70968,10 +71008,10 @@ - + - + @@ -70986,16 +71026,16 @@ - + - + - + @@ -71007,16 +71047,16 @@ - + - + - + @@ -71025,31 +71065,31 @@ - + - + - + - + - + - + - + - + @@ -71085,16 +71125,16 @@ - + - + - + - + @@ -71106,19 +71146,19 @@ - + - + - + - + @@ -71130,10 +71170,10 @@ - + - + @@ -71148,13 +71188,13 @@ - + - + @@ -71166,45 +71206,56 @@ + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -71215,10 +71266,10 @@ - + - + @@ -71226,47 +71277,36 @@ - + - + - + - + - + - + - + - - - - - - - - - - - @@ -71293,19 +71333,18 @@ - - + - + - + @@ -71316,15 +71355,15 @@ - + - - - - + + + + @@ -71347,16 +71386,16 @@ - - + + - - - + + + @@ -71374,19 +71413,19 @@ - - + + - + - - + + @@ -71394,15 +71433,15 @@ - + - + - + @@ -71413,9 +71452,9 @@ - + - + @@ -71450,28 +71489,28 @@ - + - + - + - + - + - + - + @@ -71480,56 +71519,56 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -71556,7 +71595,7 @@ - + @@ -71568,21 +71607,21 @@ - + - + - - - + + + @@ -71594,44 +71633,44 @@ - - + + - - - + + + - - - + + + - - - + + + - + - + - + - - + + @@ -71639,13 +71678,13 @@ - + - + @@ -71671,35 +71710,35 @@ - + - - + + - + - - - - - + + + + + - + - - + + @@ -71708,13 +71747,13 @@ - + - + - + @@ -71728,7 +71767,7 @@ - + @@ -71748,16 +71787,16 @@ - + - + - + @@ -71765,13 +71804,13 @@ - + - + - + @@ -71783,12 +71822,12 @@ - + - + @@ -71833,13 +71872,13 @@ - + - + - + @@ -71853,10 +71892,10 @@ - + - + @@ -71870,12 +71909,12 @@ - + - + @@ -71899,7 +71938,7 @@ - + @@ -71911,7 +71950,7 @@ - + @@ -71941,21 +71980,21 @@ - + - + - + - + @@ -71963,10 +72002,10 @@ - + - + @@ -71979,7 +72018,7 @@ - + @@ -71994,40 +72033,40 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -72041,13 +72080,13 @@ - + - + - + @@ -72067,54 +72106,54 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -72126,88 +72165,88 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -72253,7 +72292,7 @@ - + @@ -72267,7 +72306,7 @@ - + @@ -72291,57 +72330,57 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -72387,80 +72426,80 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -72469,10 +72508,10 @@ - + - + @@ -72506,7 +72545,7 @@ - + @@ -72515,13 +72554,13 @@ - + - + @@ -72542,9 +72581,9 @@ - + - + @@ -72552,7 +72591,7 @@ - + @@ -72586,7 +72625,7 @@ - + @@ -72603,7 +72642,7 @@ - + @@ -72621,17 +72660,17 @@ - + - + - + - + @@ -72657,7 +72696,7 @@ - + @@ -72671,12 +72710,12 @@ - + - + @@ -72724,7 +72763,7 @@ - + @@ -72738,23 +72777,23 @@ - + - + - - + + - + @@ -72773,13 +72812,13 @@ - + - - + + @@ -72790,25 +72829,25 @@ - - + + - + - - - + + + - - - + + + @@ -72825,80 +72864,80 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - - + + @@ -72914,7 +72953,7 @@ - + @@ -72929,85 +72968,85 @@ - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - - + + - + - + - + - + - - + + - + @@ -73016,53 +73055,53 @@ - + - + - + - - + + - + - - + + - - - + + + - + - + - - - + + + @@ -73071,34 +73110,34 @@ - + - - + + - - + + - + - - - + + + @@ -73109,13 +73148,13 @@ - + - + - + @@ -73136,7 +73175,7 @@ - + @@ -73152,37 +73191,37 @@ - + - + - + - + - + - + @@ -73191,7 +73230,7 @@ - + @@ -73206,10 +73245,10 @@ - + - + @@ -73224,7 +73263,7 @@ - + @@ -73243,32 +73282,32 @@ - + - + - + - + - + - + @@ -73299,10 +73338,10 @@ - + - + @@ -73311,29 +73350,29 @@ - + - + - + - + - + - + - + @@ -73341,7 +73380,7 @@ - + @@ -73375,18 +73414,18 @@ - + - - + + - + @@ -73404,38 +73443,38 @@ - + - + - + - + - + - + - + - + @@ -73455,7 +73494,7 @@ - + @@ -73484,7 +73523,7 @@ - + @@ -73495,8 +73534,8 @@ - - + + @@ -73511,22 +73550,22 @@ - - + + - - - + + + - + @@ -73535,24 +73574,24 @@ - + - + - + - + - + @@ -73563,7 +73602,7 @@ - + @@ -73572,22 +73611,22 @@ - + - + - + - + - + @@ -73613,28 +73652,28 @@ - + - + - + - + @@ -73648,7 +73687,7 @@ - + @@ -73660,10 +73699,10 @@ - + - + @@ -73675,7 +73714,7 @@ - + @@ -73687,7 +73726,7 @@ - + @@ -73696,10 +73735,10 @@ - + - + @@ -73708,25 +73747,25 @@ - + - + - + - + - + - + @@ -73815,7 +73854,7 @@ - + @@ -73834,7 +73873,7 @@ - + @@ -73849,19 +73888,19 @@ - + - + - + - + @@ -73870,10 +73909,10 @@ - + - + @@ -73923,28 +73962,28 @@ - + - + - + - + - + - + - + - + @@ -73987,75 +74026,75 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -74086,7 +74125,7 @@ - + @@ -74218,7 +74257,7 @@ - + @@ -74226,16 +74265,16 @@ - + - + - + - + @@ -74246,29 +74285,29 @@ - + - + - + - + - + - + - + @@ -74276,13 +74315,13 @@ - + - + - + @@ -74298,7 +74337,7 @@ - + @@ -74322,10 +74361,10 @@ - - - - + + + + @@ -74336,103 +74375,103 @@ - + - + - + - + - + - - - + + + - - + + - + - + - - - - - - + + + + + + - + - - - + + + - - - - - + + + + + - - + + - + - + - + - + - + - + - + - + - - - - - + + + + + @@ -74453,10 +74492,10 @@ - + - + @@ -74468,13 +74507,13 @@ - + - + @@ -74486,7 +74525,7 @@ - + @@ -74495,23 +74534,23 @@ - + - + - + - + - + - + @@ -74519,7 +74558,7 @@ - + @@ -74530,21 +74569,21 @@ - + - + - - + + @@ -74553,7 +74592,7 @@ - + @@ -74566,7 +74605,7 @@ - + @@ -74577,26 +74616,26 @@ - + - + - + - + @@ -74607,13 +74646,13 @@ - + - + - + @@ -74628,17 +74667,17 @@ - + - + - + - + @@ -74657,14 +74696,14 @@ - + - + @@ -74675,7 +74714,7 @@ - + @@ -74712,10 +74751,10 @@ - + - + @@ -74723,10 +74762,10 @@ - + - + @@ -74739,7 +74778,7 @@ - + @@ -74768,13 +74807,13 @@ - + - + - + @@ -74782,26 +74821,26 @@ - + - + - + - + - + - + @@ -74817,10 +74856,10 @@ - + - + @@ -74835,57 +74874,64 @@ - + - + - + - + - + - + - + - + - + - + - + + + + + + + + - + - - - - + + + + @@ -74893,72 +74939,72 @@ - - - + + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + @@ -74966,163 +75012,176 @@ - + - + - - + + - + - + - + - - + + - + - - - - + + + + - - + + - - - - - + + + + + - - - - - + + + + + - - - - - - + + + + + + - - + + - - + + - - - - + + + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - - - - - - + + + + + + + - - - + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -75133,10 +75192,10 @@ - + - + @@ -75148,43 +75207,43 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -75195,12 +75254,12 @@ - + - + @@ -75245,12 +75304,12 @@ - - + + - + @@ -75260,69 +75319,69 @@ - + - - + + - - - + + + - + - + - + - + - - - - - - - + + + + + + + - + - + - - + + - + - - + + - + @@ -75331,34 +75390,34 @@ - + - + - + - + - + - + - + - + @@ -75366,52 +75425,52 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -75420,10 +75479,10 @@ - + - + @@ -75440,15 +75499,15 @@ - + - + - + @@ -75457,14 +75516,14 @@ - + - + @@ -75478,21 +75537,21 @@ - + - + - + - + @@ -75506,32 +75565,32 @@ - + - + - + - + - + - + - + @@ -75542,19 +75601,19 @@ - + - + - + - - + + @@ -75567,63 +75626,63 @@ - - + + - - + + - + - - + + - - + + - + - - - + + + - - + + - - + + - + - + - - + + @@ -75634,18 +75693,18 @@ - - + + - + - + - - + + @@ -75653,107 +75712,107 @@ - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - + - + - - + + - - - + + + - - - + + + - - + + - - + + - + - - + + - - - - + + + + - - + + - - + + - - + + - + @@ -75768,97 +75827,97 @@ - + - + - + - - + + - + - + - + - - + + - - + + - - - + + + - + - - - - + + + + - + - + - + - + - + - + - + - + - + @@ -75866,7 +75925,7 @@ - + @@ -75875,47 +75934,47 @@ - - - + + + - + - + - + - - - + + + - - - - - + + + + + - - - - - + + + + + @@ -75925,120 +75984,120 @@ - + - + - + - + - + - + - + - - + + - + - + - + - - - + + + - - - + + + - - - + + + - - - - + + + + - - + + - - + + - - - - + + + + - + - + - - + + - + - + - + @@ -76047,19 +76106,19 @@ - + - + - + - + - + @@ -76067,212 +76126,212 @@ - + - + - + - + - + - + - + - + - - + + - - + + - + - - - + + + - - - - - + + + + + - + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - - + + + - - + - - + + - + - + - + - - + + - - + + - - + + - - + + - + - - + + - + - + - + - - + + - + @@ -76282,146 +76341,146 @@ - - - - + + + + - - - + + + - - + + - + - - - + + + - - + + - - - - - - + + + + + + - - + + - + - - - + + + - - - - - + + + + + - - - + + + - - - + + + - - + + - + - + - - - + + + - - + + - + - - - - + + + + - - - + + + - - + + - - + + - - - - + + + + - + - - + + @@ -76431,34 +76490,34 @@ - + - + - + - - + + - - + + - + - - + + - + @@ -76468,10 +76527,10 @@ - + - + @@ -76479,10 +76538,10 @@ - + - + @@ -76503,42 +76562,42 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -76552,154 +76611,154 @@ - + - + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - + + + - - + - - + + - + - - - - - - + + + + + + - - + + - - + + - + - + - - - - - - + + + + + + - + - + - + - - + + - + - + - - - + + + - - + + - - - - + + + + - - + + - - + + - - + + - - - - + + + + @@ -76713,13 +76772,13 @@ - + - + - + @@ -76727,74 +76786,74 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -76804,38 +76863,38 @@ - - + + - - - - - - + + + + + + - - - + + + - + - + - + - + - + @@ -76846,67 +76905,67 @@ - + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -76920,70 +76979,70 @@ - + - + - + - - - + + + - - - - - - + + + + + + - - + + - + - - + + - + - - + + - + - + - + @@ -76992,39 +77051,39 @@ - + - + - + - + - + - + - + - + - + @@ -77041,57 +77100,57 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -77101,7 +77160,7 @@ - + @@ -77119,347 +77178,347 @@ - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - + - - - - + + + + - - + + - + - - + + - - - - + + + + - - + + - + - - + + - - + + - - - - + + + + - - - - - + + + + + - - + + - - + + - + - - + + - - + + - + - + - + - - + + - - + + - + - + - + - - - + + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - - + + - + - + - - - + + + - + - + - + - - + + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - + + + - - - - + + + + - + - + - - + + - - + + - - - - + + + + - + - - + + - - + + @@ -77470,218 +77529,218 @@ - + - + - + - + - + - - - - + + + + - - - + + + - - - + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - + + + + + + + + + + - - - - + + + + - - - - + + + + - + - + - - - - - + + + + + - - + + - - + + - + - + - + - - + + - - - - + + + + - - - - + + + + - - - - + + + + - - + + - + - - + + - + @@ -77696,10 +77755,10 @@ - + - + @@ -77707,18 +77766,18 @@ - + - + - + - + @@ -77727,7 +77786,7 @@ - + @@ -77736,20 +77795,20 @@ - + - + - + - + - + @@ -77759,7 +77818,7 @@ - + @@ -77771,28 +77830,28 @@ - - + + - - - + + + - - + + - + - + @@ -77802,8 +77861,8 @@ - - + + @@ -77817,9 +77876,9 @@ - + - + @@ -77828,34 +77887,34 @@ - - + + - + - + - - + + - - - + + + - - - - + + + + - - + + @@ -77865,12 +77924,12 @@ - - - + + + - + @@ -77879,7 +77938,7 @@ - + @@ -77888,103 +77947,103 @@ - + - + - + - + - + - + - + - - - + + + - - + + - - - - + + + + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - + - - + + @@ -77992,7 +78051,7 @@ - + @@ -78000,70 +78059,70 @@ - + - + - + - + - + - + - + - + - - + + - - - - + + + + - + - + - + - + - + @@ -78082,13 +78141,13 @@ - + - + - + @@ -78096,21 +78155,21 @@ - + - + - + - + @@ -78118,16 +78177,16 @@ - + - + - + @@ -78135,67 +78194,67 @@ - + - + - - + + - - + + - + - + - + - + - - + + - + - - - + + + - - - - - + + + + + - - + + - - - + + + - + @@ -78358,208 +78417,208 @@ - + - + - + - - + + - + - - - - - - + + + + + + - - - - - - - + + + + + + + - + - + - + - + - - + + - - + + - + - - + + - - + + - + - + - + - - + + - - + + - + - - + + - + - + - - + + - - + + - - + + - - + + - - - - - - + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - + + - - + + - + - + @@ -78568,10 +78627,10 @@ - + - + @@ -78584,102 +78643,102 @@ - + - - - + + + - + - + - - - + + + - - - - + + + + - - - - - + + + + + - - + + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + @@ -78691,39 +78750,39 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -78741,7 +78800,7 @@ - + @@ -78754,15 +78813,15 @@ - + - + - + @@ -78776,15 +78835,15 @@ - + - + - - + + @@ -78792,34 +78851,34 @@ - + - - - - - - + + + + + + - - + + - + - - - + + + - + - - - - + + + + @@ -78828,55 +78887,55 @@ - + - - + + - - + + - - + + - + - - - + + + - - - + + + - - + + - + - - + + - - - + + + @@ -78885,10 +78944,10 @@ - + - + @@ -78897,48 +78956,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -78947,313 +79006,313 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - + - - + + - - + + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - - + + - - + + - - - - - - - + + + + + + + - + - - - - + + + + - + - + - - + + - - - + + + - - + + - - - - - - + + + + + + - - - - + + + + - + - - - - + + + + - - + + - - + + - - + + @@ -79262,80 +79321,80 @@ - - - + + + - - + + - - - + + + - + - - - + + + - + - + - + - + - + - + - + - + - - + + - - - + + + - - + + - - + + @@ -79346,121 +79405,121 @@ - + - - + + - + - - - + + + - - - - + + + + - + - - + + - + - + - + - - + + - + - - + + - + - + - - + + - + - + - - + + - - + + - + - + - - - - + + + + - + - + - + - + - - + + - + @@ -79469,11 +79528,11 @@ - + - + @@ -79482,66 +79541,66 @@ - - - + + + - + - - + + - + - - + + - - + + - + - + - - + + - + - + - - + + - + @@ -79551,139 +79610,139 @@ - + - + - + - + - + - - + + - - + + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - - + + - + - - + + - - + + - - - + + + - + - + - - + + - + - + - + - + @@ -79696,175 +79755,175 @@ - - - + + + - + - - + + - - + + - + - + - + - + - - + + - - + + - - + + - - - - + + + + + + - - - + - - - + + + - - + + - - + + - + - - + + - + - + - + - + - + - - + + - - - + + + - - - + + + - - - - + + + + - - + + - + - - + + - + - + - + - - - - + + + + @@ -79874,175 +79933,175 @@ - - + + - - + + - + - + - + - - - + + + - - + + - + - + - + - - - - + + + + - + - + - - + + - + - + - + - + - + - - + + - - - + + + - - + + - + - - + + - + - - - + + + - + - - - - + + + + - + - - - - + + + + - - - - - - + + + + + + - - - + + + - - - + + + - - - + + + - - + + - - + + @@ -80062,7 +80121,7 @@ - + @@ -80083,23 +80142,23 @@ - + - + - - + + - + - - + + @@ -80112,39 +80171,39 @@ - + - + - - - + + + - - - + + + - + - + @@ -80152,12 +80211,12 @@ - - + + - - + + @@ -80184,11 +80243,11 @@ - + - + @@ -80196,7 +80255,7 @@ - + @@ -80204,20 +80263,20 @@ - + - + - - + + - + @@ -80228,8 +80287,8 @@ - - + + @@ -80237,31 +80296,31 @@ - + - - + + - + - + - + - + @@ -80285,7 +80344,7 @@ - + @@ -80296,8 +80355,8 @@ - - + + @@ -80342,12 +80401,12 @@ - + - + - + @@ -80375,23 +80434,23 @@ - + - + - + - + - - + + @@ -80399,22 +80458,22 @@ - + - + - - + + - + @@ -80423,288 +80482,288 @@ - + - + - + - + - - + + - + - - + + - - + + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - - + + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - - + + - + - - + + - + - - + + - - + + - + - + - + - - + + - + - - + + - - + + - + - + - + - + - - + + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + @@ -80713,107 +80772,107 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -80822,502 +80881,502 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -81326,10 +81385,10 @@ - + - + @@ -81344,37 +81403,37 @@ - + - + - + - + - + - + - + - + - + - + - - + + @@ -81384,84 +81443,84 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -81473,58 +81532,58 @@ - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + @@ -81532,49 +81591,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -81582,30 +81641,30 @@ - + - + - + - + - + - + - + - + - + @@ -81617,73 +81676,73 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -81692,34 +81751,34 @@ - + - + - + - + - + - + - + - + @@ -81731,49 +81790,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -81782,30 +81841,30 @@ - + - + - + - + - + - + - + - + - + @@ -81814,13 +81873,13 @@ - + - + - + @@ -81829,84 +81888,84 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -81915,19 +81974,19 @@ - + - + - + - + - + @@ -81936,33 +81995,33 @@ - + - + - + - + - + - + - + - + - + - + @@ -81986,152 +82045,152 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -82140,7 +82199,7 @@ - + @@ -82149,149 +82208,149 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -82324,290 +82383,290 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -82615,21 +82674,21 @@ - + - + - + - + - + @@ -82641,203 +82700,203 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + @@ -82846,24 +82905,24 @@ - + - + - + - + - + - + @@ -82871,87 +82930,87 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -82960,150 +83019,150 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -83112,7 +83171,7 @@ - + @@ -83121,42 +83180,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -83165,130 +83224,130 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -83300,121 +83359,121 @@ - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -83428,35 +83487,35 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -83465,22 +83524,22 @@ - + - + - + - + - + - + @@ -83489,52 +83548,52 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -83543,101 +83602,101 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -83649,134 +83708,134 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -83785,62 +83844,62 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - - + + - + @@ -83851,48 +83910,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -83901,7 +83960,7 @@ - + @@ -83910,50 +83969,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -83965,38 +84024,38 @@ - + - + - + - + - + - + - - + + - + - + - + - + - + @@ -84005,30 +84064,30 @@ - + - + - + - + - + - + - + - + @@ -84048,75 +84107,75 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -84125,298 +84184,298 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -84437,7 +84496,7 @@ - + @@ -84494,7 +84553,7 @@ - + @@ -84530,7 +84589,7 @@ - + @@ -84632,10 +84691,10 @@ - + - + @@ -84644,22 +84703,22 @@ - + - + - + - + - + - + @@ -84680,45 +84739,45 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -84727,80 +84786,80 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -84812,72 +84871,72 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + @@ -84885,254 +84944,254 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -85183,10 +85242,10 @@ - + - + @@ -85225,151 +85284,151 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -85387,117 +85446,117 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -85509,59 +85568,59 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -85573,211 +85632,211 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -85789,7 +85848,7 @@ - + @@ -85803,60 +85862,60 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -85868,27 +85927,27 @@ - + - + - + - + - + - + - + - + @@ -85897,22 +85956,22 @@ - + - + - + - + - + - + @@ -85920,9 +85979,9 @@ - + - + @@ -85934,277 +85993,277 @@ - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -86213,39 +86272,39 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -86254,507 +86313,507 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + @@ -86838,10 +86897,10 @@ - + - + @@ -86853,36 +86912,36 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -86891,25 +86950,25 @@ - + - + - + - + - + - - - - + + + + @@ -86935,28 +86994,28 @@ - - + + - + - + - + - + - - + + - + - + @@ -86964,92 +87023,92 @@ - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -87061,52 +87120,52 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -87121,10 +87180,10 @@ - + - + @@ -87133,59 +87192,59 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -87194,7 +87253,7 @@ - + @@ -87203,485 +87262,488 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -87689,16 +87751,16 @@ - - + + - + - + - + @@ -87709,7 +87771,7 @@ - + @@ -87726,7 +87788,7 @@ - + @@ -87751,7 +87813,7 @@ - + @@ -87868,7 +87930,7 @@ - + @@ -87877,13 +87939,13 @@ - + - + - + @@ -87891,117 +87953,117 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -88016,18 +88078,18 @@ - + - + - + - + - + @@ -88036,156 +88098,156 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + @@ -88214,15 +88276,15 @@ - + - + - + @@ -88251,31 +88313,31 @@ - + - + - + - + - + - + - + - + - + @@ -88283,13 +88345,13 @@ - - + + - + @@ -88300,15 +88362,15 @@ - + - + - + @@ -88317,166 +88379,166 @@ - - - + + + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -88485,494 +88547,494 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -88980,87 +89042,87 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -89072,1637 +89134,1637 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - + + - - - - + + + + - - + + - + - + - - - - - - - - - + + - - + + + + - - - + + + + - - - + + + - - - + + + + + + + - - - - - - - + + - - - + + + - - + + + - - - - + + + - - - + + - - + + + - - + + - - - - + + - - - - + + + + - + + + + - - - - + + - + + + - - - - + - - - - - - + + + + - - - - - + + + + + + - - + + + + + - - + + - + + - + + + + + + + + + + - - + + - - - - - - - - - - - - - + + + - + + - + - - + - - + + - - - - - + + - - - - - - + + + + + - - + + + + + + - - + + - - - + - - - + + + + + + - + - + - - - - - + + + + + + + + + - - - - - - - + - - - + + + - + + + - - + - - + + - - - - + - - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - + + + - - - + + - - - + + + + - + + - + - - - - + - - + + + + + - - - + + - + + - - - + + + - - - - + + - - - + + + + + - - - + + - - - - - - - - + + - + - - - + + + + + + + + + + - - - - + + - - + + + + - - - + + - - - - + + + - - - - + + + + - - - - - - - - + + + + + - - - - - - + + + + + + + - - - + + + + + + - - + + + - - - + + - - - - + + + - - - - + + + + - + + + + - - - + - - + + + - - - + + - - - + + + + - - - + + - - - + + + - - - + + + + - - - - - + + - - - + + + + + + - - - + + + - - - - + + - - - + + + + - - - + + + - - + + + - - + - - + + + - - + + - - - + + - - - - + + + - - - - - + + + + - - + + + + + - - - - + + - - - - - + + + + - - + + - - - + + - - - + + + + + + - - - - - + + + - - - - - - + + + + + - - - + + + + + + - - - - - - + + + - - - - - + + + + + + - - + + + + + - - - - + + - - - - + + + + - - - - - - + + + + - - + + + + + + - - - - + + - - + + + + - - + + - - - + + - - + + + - - - + + - - + + + - - + + - - + + - - + + - - - + + - - - + + + - - - - + + + - - - + + + + - - + + + - - - + + - - - - - - - - + + + - - - + + + + + + + + - - - - + + + - - - - + + + + - - + + + + - - - - + + + - - - + + + + + + + + - + - - - - - - - - - + + + + + - - - + + - - + + + + + + + - - - - - - + - - - + + + - - + + + - - - - - - + + - - + + + + + + + + + + - - + + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - - - + + + - - + + - - + + - - + + - + - - + + - - - - + + + + - - + + - + - - + + - + - + - + - + - - - + + + - + - - + + - + - + - + - + - + - + - + - + - - - - + + + + - + - - + + - - - + + + - + - - + + - - + + - - + + - + - - + + - + - + - + - - + + - + - + - - - - - + + + + + - - - + + + - - + + - - + + - - + + - + - - - + + + - - + + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -90710,219 +90772,219 @@ - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - + + + - - + + - - - - - - - + - - + + + - - + + - - - - + + + - + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - - - - - + + + + + + - - + + - - + + - + - - + + - - - - + + + + - - - + + + - - - + + + - + - - - - - - - - + + + - - - + + + + + + + + - + - - - + + + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - + @@ -90939,7 +91001,7 @@ - + @@ -90948,334 +91010,334 @@ - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - - - - + + + + - - + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + + + + + + + + + - - - - + + + + - - + + - - - - - - - + - - - + + + + + - - + + + + + + - - + + - - + + - - + + - - - - + + + + - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - + + - + - - + + - - + + - - + + @@ -91284,24 +91346,24 @@ - - + + - + - + - - + + - - - + + + @@ -91309,66 +91371,66 @@ - - + + - - + + - - - + + + - + - - + + - + - - + + - - + + - - + + - - + + - + - - - + + + @@ -91379,55 +91441,55 @@ - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -91439,26 +91501,26 @@ - + - + - + - + - + - + - + - + @@ -91470,7 +91532,7 @@ - + @@ -91479,24 +91541,24 @@ - + - + - + - + - + - + - + @@ -91508,13 +91570,13 @@ - + - + - + @@ -91523,1321 +91585,1315 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - - - + + + - - - + + + - + - - + + - + - + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - - - + + + + - - - + + + - - + + - - + + - + - - + + - + - + - + - - + + - - + + - - - + + + - - - - - + + + + + - + - + - + - + - + - + - + - + - - - - + + + + - - - + + + - - - - + + + + - + - - + + - + - - - + + + - + - - + + - - - - - - - - + + - - - + + + - - + + - + - - + + - + - + - + - - + + - - + + - + - - - - + + + + - - - - + + + + - + - + - + - + - + - + - + - - - - + + + + - - + + - - - - + + + + - - - - + + + + - - - - + + + + - - + + - - - + + + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - + + - - - + + + - - - - - - - + + + + + + + - - - + + + - + - + - - - + + + - + - + - + - + - + - - - + + + - - - - + + + + - + - - - + + + - + - - + + - - - + + + - + - - + + - + - + - - - + + + - - + + - - - - - - - + + + + + + + - - - - - - + + + + + + - - - - - + + + + + - - + + - - - + + + - - - - - - + + + + + + - - - - - + + + + + - - - + + + - - + + - + - - + + - - - + + + - + - - + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - + - - + + - + - - + + - - + + - + - - - + + + - + - - + + - + - - + + - - - + + + - - + + - - + + - + - - - + + + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - + + + + - - - + + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - - - + + + - - - + + + - - - - - + + + + + - - + + - + - - - - + + + + - - - + + + - + - - - - + + + + - + - + - - + + - - + + - + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - - + + - - - - + + + + - - + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - + + - - + + - - + + - + - + - - - + + + - - - - + + + + - - - - - - + + + + + + - - - - + + + + - - - + + + - - - - + + + + - + - + - + - - - + + + - - - - - - + + + + + + - - + + - - + + - - - - + + + + - - - + + + - - + + - + - + - + - + - - - - + + + + - - - - - - + + + + + + - + - - + + - - - - + + + + - - + + - - + + - - + + - - - - + + + + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -92846,129 +92902,129 @@ - + - - - - + + + + - - + + - - - - + + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - + - - - + + + - - - + + + - - - - + + + + - - - - + + + + - + - + - - - + + + - - + + - - + + - - - - - + + + + + - - + + - - - + + + - - + + @@ -93005,102 +93061,88 @@ - - - - + + + + - - + + - - + + - - + + - - + + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - + @@ -93123,10 +93165,10 @@ - + - + @@ -93153,10 +93195,10 @@ - + - + @@ -93168,22 +93210,22 @@ - + - + - + - + - + @@ -93213,58 +93255,58 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -93276,43 +93318,43 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -93333,24 +93375,24 @@ - + - + - + - + - + @@ -93377,19 +93419,19 @@ - + - + - + - + - + @@ -93401,10 +93443,10 @@ - + - + @@ -93416,7 +93458,7 @@ - + @@ -93425,19 +93467,19 @@ - + - + - + - + @@ -93452,13 +93494,13 @@ - + - + - + @@ -93467,49 +93509,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -93518,16 +93560,16 @@ - + - + - + - + @@ -93542,37 +93584,37 @@ - + - + - + - + - + - + - + - + - + - + @@ -93593,10 +93635,10 @@ - + - + @@ -93611,61 +93653,61 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -93674,79 +93716,79 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -93755,13 +93797,13 @@ - + - + - + @@ -93770,97 +93812,97 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -93869,7 +93911,7 @@ - + @@ -93913,19 +93955,19 @@ - + - + - + - + - + @@ -93936,13 +93978,13 @@ - + - + - + @@ -93951,47 +93993,47 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -94000,22 +94042,22 @@ - + - + - + - + - + - + @@ -94052,7 +94094,7 @@ - + @@ -94064,7 +94106,7 @@ - + @@ -94073,16 +94115,16 @@ - + - + - + - + @@ -94093,7 +94135,7 @@ - + @@ -94111,10 +94153,10 @@ - + - + @@ -94123,16 +94165,16 @@ - + - + - + - + @@ -94141,33 +94183,33 @@ - + - + - + - + - + - + - + - + @@ -94184,10 +94226,10 @@ - + - + @@ -94205,25 +94247,25 @@ - + - + - + - + - + - + - + @@ -94256,31 +94298,31 @@ - + - + - + - + - + - + - + - + @@ -94289,13 +94331,13 @@ - + - + - + @@ -94313,49 +94355,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -94364,7 +94406,7 @@ - + @@ -94382,7 +94424,7 @@ - + @@ -94394,25 +94436,25 @@ - + - + - + - + - + - + - + @@ -94421,30 +94463,30 @@ - + - + - + - + - + - + - + @@ -94492,7 +94534,7 @@ - + @@ -94510,9 +94552,9 @@ - + - + @@ -94523,14 +94565,14 @@ - + - + - + - + @@ -94539,74 +94581,74 @@ - + - - + + - - + + - - - - + + + + - - + + - - - + + + - - - + + + - - + + - + - - - + + + - + - + - - + + - - + + - + - - - + + + @@ -94623,17 +94665,17 @@ - + - + - + @@ -94642,59 +94684,59 @@ - + - - + + - + - + - + - - + + - + - - + + - - + + - + - + - + @@ -94702,14 +94744,14 @@ - + - + @@ -94725,7 +94767,7 @@ - + @@ -94753,16 +94795,16 @@ - + - + - - + + - + @@ -94771,15 +94813,15 @@ - + - + - + @@ -94787,7 +94829,7 @@ - + @@ -94795,11 +94837,11 @@ - + - + @@ -94808,45 +94850,45 @@ - - - + + + - - + + - - + + - - - - - - + + + + + + - - - - - + + + + + - + @@ -94866,7 +94908,7 @@ - + @@ -94874,7 +94916,7 @@ - + @@ -94884,33 +94926,33 @@ - + - - + + - + - + - + - - + + - + @@ -94920,48 +94962,48 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -94973,14 +95015,14 @@ - + - + - + @@ -94989,292 +95031,292 @@ - - + + - + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - - + + + + - + - + - - - + + + - + - - - + + + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - - - + + + + - + - + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - + + - - - - + + + + - - - - + + + + - - - + + + - - - + + + - - - - + + + + - - - - - - + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - + + - - - - - + + + + + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - - - + + + - - + + - - - + + + - + - + - + - + - + - + - + @@ -95284,23 +95326,23 @@ - - + + - - + + - + - + @@ -95308,7 +95350,7 @@ - + @@ -95317,72 +95359,72 @@ - + - - - + + + - - + + - - + + - + - - - - + + + + - + - - - - - - - + + + + + + + - - + + - + - - - + + + - - + + - + - + @@ -95390,19 +95432,19 @@ - + - + - + - + - + @@ -95420,30 +95462,30 @@ - + - + - + - + - + - + - + @@ -95455,24 +95497,24 @@ - - - - - - - + + + + + + + - + - + @@ -95482,590 +95524,625 @@ - + - + - + - - + + - + - - - + + + - + - - - - - + + + + + - - + + - - + + - - - + + + - - - + + + - - - + + + - + - - + + - - + + - + - - - - + + + + - - - - + + + + - + - - + + - + - + - - + + - + - + - + - + - - - + + + - + - - - + + + - + - + - - + + - + - + - - - + + + - - + + - + - - + + - - + + - - + + - + + + + + + + + + - + - + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - + - + - + - + + + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - - + + + - + - + - + - + - + - + - - - + + + - - - + + + - - - + + + - - - - + + + + - + - + - + - + - + - + - + - - - + + + - - + + - - - + + + - - + + - + - - + + - - - - + + + + - + - - - - - - - + + + + + + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + @@ -96080,10 +96157,10 @@ - + - + @@ -96091,35 +96168,35 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -96128,33 +96205,33 @@ - + - + - + - + - + - + - + - + - + - + @@ -96163,13 +96240,13 @@ - + - + - + @@ -96195,60 +96272,60 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -96259,9 +96336,9 @@ - + - + @@ -96282,24 +96359,24 @@ - + - + - + - + - + - + - + @@ -96310,7 +96387,7 @@ - + @@ -96324,84 +96401,84 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -96409,7 +96486,7 @@ - + @@ -96418,3605 +96495,228 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - + + + + - + - - - + + + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -100031,159 +96731,3567 @@ - + - + - - - - - - - - - + - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + - + - + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - - - - - + + + + + - - + + - - + + - - - + + + - - - - - + + + + + - - - - - - + + + + + + - + - + - + - + - + - + @@ -100191,248 +100299,256 @@ - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - - - + + + - - - + + + + + + + + + + + - - - - - + + + + + - - + + - + - - + + - + - + - - + + - - + + - + - - - + + + - - - - + + + + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + @@ -100441,15 +100557,15 @@ - + - + - + - + @@ -100458,7 +100574,7 @@ - + @@ -100472,91 +100588,91 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -100573,478 +100689,478 @@ - + - + - + - + - + - + - + - - + + - + - + - + - + - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + - + - + - - - + + + - - - - - + + + + + - - - - + + + + - - - - - + + + + + - - + + - - + + - + - + - - + + - - + + - - - - + + + + - - - - + + + + - - - + + + - + - + - + - + - + - + - + - + - - - + + + - - + + - - - + + + - + - - - + + + - - - + + + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -101053,98 +101169,98 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + @@ -101162,27 +101278,27 @@ - + - + - + - + - + - + - + - + @@ -101193,47 +101309,47 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -101242,54 +101358,54 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -101300,7 +101416,7 @@ - + @@ -101311,231 +101427,231 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -101544,38 +101660,38 @@ - + - + - + - + - + - + - + - + - + - + - - + + @@ -101592,23 +101708,23 @@ - + - + - + - + - + - + @@ -101617,123 +101733,123 @@ - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -101745,10 +101861,10 @@ - + - + @@ -101757,57 +101873,57 @@ - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -101817,16 +101933,16 @@ - + - + - + - - + + @@ -101840,43 +101956,43 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -101885,306 +102001,306 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -102204,27 +102320,27 @@ - + - + - + - + - + - + - + - + @@ -102232,401 +102348,401 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -102635,177 +102751,177 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -102818,160 +102934,160 @@ - - + + - + - + - + - - + + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -102979,206 +103095,206 @@ - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -103186,253 +103302,253 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -103443,10 +103559,10 @@ - + - + @@ -103455,334 +103571,334 @@ - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + @@ -103790,146 +103906,146 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -103938,77 +104054,77 @@ - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - + - + @@ -104017,1208 +104133,1216 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - - + + + - + - - + + - + - - + + - - - - - - + - - + + - - + + - - + + - - + + - - - + + - - + + - - + + - - + + - - + + - - - + + + - - - - + + + - - - + + + + - - - - - - - - - + + + + + + + + + - - + + - - + + - - + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - - + + + - - - + + + + - - - - + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - + + + + + - - - - + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - + + - - + - - + + - - - + + - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + - - + + + + - - - - - - + + + - - - + + + + + + - - - + + + + + + + + + - - - - - - - - + + + + - - - + + - - - - + + + - - - + + + + - - - + + + - - - + + + - - - - + + + - - - - - + + + + - - - - + + + + + - - - - - - + + + + + + + + + + + + - - + + - - - + + + - - - + + + - + - - - - + + + + - + - + - + - - + + + + + + + + + + @@ -105364,8 +105488,8 @@ - - + + @@ -105652,744 +105776,744 @@ - - + + - + - + - + - + - + - + - + - - - - - + + + + + - - + + - - - + + + - - - + + + - + - + - - - - + + + + - - - - - - + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - + + + + + + + - - - - - + + + + + - - - - - + + + + + - + - - - - + + + + - - - + + + - - - - - - + + + + + + - - - + + + - - + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - - - + + + - - - + + + - + - - - + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - + + + + + + - - - + + + - - + + @@ -106403,142 +106527,142 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - - - - + + + + - - - - + + + + - - - - - - - + + + + + + + - + - + - + - + - - - + + + - - - - - - - + + + + + + + - + @@ -106546,318 +106670,318 @@ - + - + - - + + - - + + - - + + - - - - - + + + + + - - + + - + - - + + - + - + - - + + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - - + + - - - - - - + + + + + + - - - + + + - - + + - - - - + + + + - + - + - + - - - - + + + + - - - + + + - - - + + + - + - + - + - + - + - + - - + + - - - + + + - - - - + + + + @@ -106870,367 +106994,367 @@ - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - + + + + + + + + + + + - + - - - + + + - - + + @@ -107245,63 +107369,63 @@ - + - + - + - - - - + + + + - + - - + + - + - + - + - + - + - + - - + + - - + + - - + + @@ -107318,7 +107442,7 @@ - + @@ -107326,7 +107450,7 @@ - + @@ -107335,49 +107459,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -107386,124 +107510,124 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + + + + - + - - + + - - - + + + - + - - - - - + + + + + - + - - - - - - - - - - - - - + + + + + + + - - + + + + - - + + + + + + - - + + - + - - - + + + - - - - + + + + @@ -107514,22 +107638,22 @@ - + - + - + - + - + @@ -107538,20 +107662,20 @@ - + - + - + - + - - + + @@ -107567,55 +107691,55 @@ - - - + + + - + - - - + + + - - + + - + - + - - - + + + - + - + - + - + - - + + - - - + + + @@ -107626,48 +107750,48 @@ - - + + - + - - + + - - + + - - + + - + - + - + - + - + - + - + @@ -107678,84 +107802,85 @@ - + - + - + - + - - - - - - + + + + + + - + - - - + + + - - - + + + - - - + + + - - + + - + - - + + + - - + + - + - + @@ -107765,29 +107890,35 @@ - - + + - - - + + + - + - + + + + + + + - - + + @@ -107796,8 +107927,8 @@ - - + + @@ -107806,72 +107937,72 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -107880,229 +108011,225 @@ - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - + + + + - + - - - - - - - - - - - - - - - - - + + + - - - - - + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + - - - - - - - + + + + + - - - - - - - + + + + + + - - + + + + + + + - - + + + + + + - + + + + + + + + + + - + - + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - + - - + + - - + + - - + + - - + + - + - + - + - + - + - - - - @@ -108116,113 +108243,117 @@ - + + + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -108231,403 +108362,403 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -108639,23 +108770,23 @@ - + - + - - + + - - + + @@ -108667,154 +108798,154 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + @@ -108822,7 +108953,7 @@ - + @@ -108857,37 +108988,37 @@ - + - + - + - + - + - + - + - + - + - + @@ -108902,7 +109033,7 @@ - + @@ -108913,7 +109044,7 @@ - + @@ -108921,23 +109052,23 @@ - + - + - + - + - + @@ -108954,7 +109085,7 @@ - + @@ -108980,7 +109111,7 @@ - + @@ -108988,10 +109119,10 @@ - + - + @@ -109023,122 +109154,122 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -109147,28 +109278,28 @@ - + - + - + - + - + - + - + - - + + @@ -109180,261 +109311,261 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -109475,277 +109606,277 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -109766,244 +109897,244 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -110023,40 +110154,40 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -110067,7 +110198,7 @@ - + @@ -110090,84 +110221,84 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -110176,909 +110307,909 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - - + + - - + + - - + + - + - - - + + + - - + + - - - + + + - + - - - + + + - - + + - - - + + + - - + + - - + + - - + + - - - - - + + + + + - - - - - + + + + + - - + + - - - - - + + + + + - + - - + + - - - - - - - - - - - - + - - - + + + - - + + - - - + + + - - - - - - + + + + + + + - + - - - + + + - + - - + - + - + - + - - + + - - + + + - - - + + - - + + - - - + + + - - - + + - - - + + + - - - + + + - + + - + + + - - + + - - - + - + + - - + + + - - + - - + + - - - - - + + - + - - - - + + + + - - - + - - - + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + - - - - - - - - + + + - - - + + + - - + + - - - + + + - + + - - + + + - - - + - + - - - - + - - - + + + + + - - - - - + + + + - - - - - + + - - - - - + + + + + - - - + + + + + - + + + + + - - + + - - + - + + + - - + + - - + - - + + - - - + + - - - - + + + + - - - - + + + + + - - + + + - - - + + + - - - + + - - + + + - - + + + + + + + + + + + - + - + - + - - - + + + - - - - - + + + + + - - - - - + + + + + - - + + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - - - + + + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - - - - + + + + - - + + - - - + + + - - + + - + - + @@ -111095,44 +111226,52 @@ - - - + + + - - - + + + - + + + + + + + + + - + - + - + - + - + - + - + - + @@ -111144,156 +111283,148 @@ - + - + - + - + - + - + - + - - + + - - + + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - - - - - - - + + - - - + + + - + - + - - + + - - + + - + - + - + - + - + @@ -111308,94 +111439,94 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -111404,18 +111535,18 @@ - + - + - + - + - + @@ -111424,57 +111555,57 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -111489,31 +111620,31 @@ - + - + - + - + - + - + - + @@ -111522,93 +111653,93 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -111619,9 +111750,9 @@ - + - + @@ -111633,28 +111764,28 @@ - + - + - + - + - + - + - + - + @@ -111663,76 +111794,76 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -111744,24 +111875,24 @@ - + - + - + - + - + - + - + @@ -111770,21 +111901,21 @@ - + - + - + - + - + @@ -111795,7 +111926,7 @@ - + @@ -111815,42 +111946,42 @@ - - - - - - - - - - - + + + + + + + + + + + - - - - - - + + + + + + - - - + + + - - - - + + + + - + - + @@ -111862,9 +111993,9 @@ - + - + @@ -111872,6 +112003,6 @@ diff --git a/abi_gki_aarch64_unisoc_whitelist b/abi_gki_aarch64_unisoc_whitelist index 1ec428eac6c0..aa8483250f7d 100644 --- a/abi_gki_aarch64_unisoc_whitelist +++ b/abi_gki_aarch64_unisoc_whitelist @@ -98,6 +98,7 @@ devm_free_irq devm_gpiochip_add_data devm_gpiod_get + devm_gpio_free devm_gpio_request devm_hwspin_lock_request_specific __devm_iio_device_register @@ -189,6 +190,7 @@ gpiod_direction_output_raw gpiod_get_raw_value gpiod_set_raw_value + gpiod_set_raw_value_cansleep gpiod_to_chip gpiod_to_irq gpio_free @@ -199,6 +201,7 @@ handle_level_irq i2c_del_driver i2c_register_driver + i2c_transfer_buffer_flags i2c_smbus_read_byte_data i2c_smbus_write_byte_data ida_alloc_range @@ -220,6 +223,33 @@ input_register_device __ioremap iounmap + iommu_alloc_resv_region + iommu_attach_device + iommu_detach_device + iommu_device_register + iommu_device_unregister + iommu_dma_get_resv_regions + iommu_domain_alloc + iommu_domain_free + iommu_domain_get_attr + iommu_domain_set_attr + iommu_fwspec_add_ids + iommu_fwspec_free + iommu_get_dma_cookie + iommu_get_domain_for_dev + iommu_group_get + iommu_group_get_for_dev + iommu_group_get_iommudata + iommu_group_put + iommu_group_ref_get + iommu_group_remove_device + iommu_group_set_iommudata + iommu_map + iommu_map_sg + iommu_present + iommu_put_dma_cookie + iommu_set_fault_handler + iommu_unmap ip_route_output_flow irq_find_mapping irq_get_irq_data @@ -263,6 +293,8 @@ ktime_get_real_seconds ktime_get_real_ts64 kzfree + __list_add_valid + __list_del_entry_valid memcpy memset misc_deregister @@ -435,6 +467,7 @@ seq_putc seq_puts seq_read + set_normalized_timespec64 set_user_nice sg_init_table sg_miter_next @@ -460,6 +493,7 @@ snd_pcm_hw_constraint_minmax snd_pcm_lib_ioctl snd_pcm_period_elapsed + snd_soc_add_component_controls snd_soc_dapm_disable_pin snd_soc_dapm_enable_pin snd_soc_dapm_ignore_suspend @@ -826,6 +860,9 @@ # required by microarray_fp.ko cdev_alloc +# required by mmc_hsq.ko + mmc_cqe_request_done + # required by musb_hdrc.ko device_wakeup_enable dev_printk @@ -947,6 +984,8 @@ memcmp mutex_is_locked of_devfreq_cooling_register_power + of_hwspin_lock_get_id_byname + of_modalias_node on_each_cpu prepare_to_wait put_unused_fd @@ -1134,6 +1173,7 @@ mmc_of_parse mmc_regulator_set_vqmmc mmc_remove_host + mmc_request_done __sdhci_add_host sdhci_cleanup_host sdhci_enable_clk @@ -1225,6 +1265,14 @@ # required by sipc_core.ko gen_pool_destroy + mbox_chan_received_data + mbox_chan_txdone + mbox_client_txdone + mbox_controller_register + mbox_controller_unregister + mbox_free_channel + mbox_request_channel + mbox_send_message register_syscore_ops # required by sipx.ko @@ -1233,6 +1281,15 @@ hrtimer_start_range_ns hrtimer_try_to_cancel +# required by snd-soc-aw881xx.ko + i2c_smbus_write_byte + +# required by snd-soc-akm4377.ko + regcache_mark_dirty + regcache_sync + snd_soc_get_volsw + snd_soc_put_volsw + # required by snd-soc-sprd-audio-dma.ko dmam_alloc_attrs dmam_free_coherent @@ -1302,6 +1359,16 @@ snd_ctl_boolean_mono_info snd_pcm_hw_constraint_list +# required by snd-soc-tfa98xx.ko + crc32_le + device_create_bin_file + device_remove_bin_file + msleep_interruptible + snd_pcm_format_width + snd_pcm_hw_constraint_mask64 + snd_soc_dapm_add_routes + snd_soc_dapm_new_controls + # required by sprd-cpufreq-common.ko dev_pm_opp_remove @@ -1328,6 +1395,7 @@ dma_get_sgtable_attrs dma_mmap_attrs dma_set_coherent_mask + drm_add_edid_modes drm_atomic_helper_async_commit drm_atomic_helper_check drm_atomic_helper_cleanup_planes @@ -1350,17 +1418,33 @@ __drm_atomic_helper_plane_destroy_state __drm_atomic_helper_plane_duplicate_state drm_atomic_helper_prepare_planes + drm_atomic_helper_resume drm_atomic_helper_set_config drm_atomic_helper_shutdown + drm_atomic_helper_suspend drm_atomic_helper_swap_state + drm_atomic_helper_update_legacy_modeset_state drm_atomic_helper_update_plane drm_atomic_helper_wait_for_dependencies + drm_atomic_helper_wait_for_fences + drm_atomic_helper_wait_for_vblanks + drm_atomic_private_obj_fini + drm_atomic_private_obj_init + drm_atomic_set_crtc_for_connector + drm_atomic_set_fence_for_plane + drm_atomic_set_mode_for_crtc + drm_atomic_state_alloc + drm_atomic_state_clear + drm_atomic_state_default_clear + drm_atomic_state_default_release __drm_atomic_state_free drm_bridge_attach + drm_connector_attach_content_protection_property drm_connector_attach_encoder drm_connector_cleanup drm_connector_init drm_connector_unregister + drm_connector_update_edid_property drm_crtc_cleanup __drm_crtc_commit_free drm_crtc_handle_vblank @@ -1370,9 +1454,21 @@ drm_crtc_vblank_on drm_display_mode_from_videomode drm_display_mode_to_videomode + drm_dp_aux_register + drm_dp_aux_unregister + drm_dp_calc_pbn_mode + drm_dp_channel_eq_ok + drm_dp_clock_recovery_ok + drm_dp_dpcd_read + drm_dp_dpcd_read_link_status + drm_dp_dpcd_write drm_encoder_cleanup drm_encoder_init drm_format_info + drm_gem_cma_prime_get_sg_table + drm_gem_cma_prime_mmap + drm_gem_cma_prime_vmap + drm_gem_cma_prime_vunmap drm_gem_cma_vm_ops drm_gem_create_mmap_offset drm_gem_fb_create @@ -1383,12 +1479,19 @@ drm_gem_object_init drm_gem_object_put_unlocked drm_gem_object_release + drm_gem_prime_export drm_gem_prime_fd_to_handle + drm_gem_prime_handle_to_fd drm_gem_prime_import drm_gem_vm_close + drm_get_edid + drm_hdcp_check_ksvs_revoked + drm_hdcp_update_content_protection + drm_helper_hpd_irq_event drm_helper_probe_single_connector_modes drm_kms_helper_poll_fini drm_kms_helper_poll_init + drm_match_cea_mode drm_mode_config_reset drm_mode_create drm_mode_crtc_set_gamma_size @@ -1628,7 +1731,22 @@ free_percpu_irq irq_create_of_mapping panic_notifier_list + register_virtio_device + register_virtio_driver __request_percpu_irq + unregister_virtio_device + unregister_virtio_driver + virtqueue_add_inbuf + virtqueue_add_outbuf + virtqueue_detach_unused_buf + virtqueue_get_buf + virtqueue_get_vring_size + virtqueue_kick + virtqueue_kick_prepare + virtqueue_notify + vring_del_virtqueue + vring_interrupt + vring_new_virtqueue wait_woken woken_wake_function @@ -1757,3 +1875,4 @@ of_usb_host_tpl_support pci_bus_type __usb_create_hcd + usb_hcd_platform_shutdown diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index d22c12cc4a28..a2100c013d81 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -11,9 +11,11 @@ CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_IKHEADERS=y CONFIG_UCLAMP_TASK=y +CONFIG_CGROUPS=y CONFIG_MEMCG=y CONFIG_MEMCG_SWAP=y CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y @@ -22,7 +24,6 @@ CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_PID_NS is not set -CONFIG_SCHED_AUTOGROUP=y CONFIG_BLK_DEV_INITRD=y # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set @@ -61,6 +62,7 @@ CONFIG_PM_WAKELOCKS_LIMIT=0 CONFIG_ENERGY_MODEL=y CONFIG_CPU_IDLE=y CONFIG_ARM_CPUIDLE=y +CONFIG_ARM_PSCI_CPUIDLE=y CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_TIMES=y CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y @@ -206,8 +208,6 @@ CONFIG_CFG80211=y CONFIG_MAC80211=y CONFIG_RFKILL=y CONFIG_PCI=y -CONFIG_PCIEPORTBUS=y -# CONFIG_PCIEAER is not set CONFIG_PCI_HOST_GENERIC=y CONFIG_PCIE_QCOM=y CONFIG_PCIE_KIRIN=y @@ -501,9 +501,10 @@ CONFIG_DEBUG_STACK_USAGE=y CONFIG_DEBUG_MEMORY_INIT=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_DETECT_HUNG_TASK is not set -CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_OOPS=y +CONFIG_PANIC_TIMEOUT=-1 CONFIG_SCHEDSTATS=y # CONFIG_DEBUG_PREEMPT is not set -CONFIG_DEBUG_LIST=y +CONFIG_BUG_ON_DATA_CORRUPTION=y CONFIG_CORESIGHT=y CONFIG_CORESIGHT_STM=y diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig index 1c21961dc514..1ac36ee4baeb 100644 --- a/arch/x86/configs/gki_defconfig +++ b/arch/x86/configs/gki_defconfig @@ -12,8 +12,10 @@ CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_IKHEADERS=y CONFIG_UCLAMP_TASK=y +CONFIG_CGROUPS=y CONFIG_MEMCG=y CONFIG_MEMCG_SWAP=y +CONFIG_CGROUP_SCHED=y CONFIG_UCLAMP_TASK_GROUP=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y @@ -22,7 +24,6 @@ CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set # CONFIG_PID_NS is not set -CONFIG_SCHED_AUTOGROUP=y CONFIG_BLK_DEV_INITRD=y # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set @@ -437,6 +438,7 @@ CONFIG_DEBUG_STACK_USAGE=y CONFIG_DEBUG_MEMORY_INIT=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_DETECT_HUNG_TASK is not set +CONFIG_PANIC_ON_OOPS=y CONFIG_PANIC_TIMEOUT=5 CONFIG_SCHEDSTATS=y -CONFIG_DEBUG_LIST=y +CONFIG_BUG_ON_DATA_CORRUPTION=y diff --git a/block/blk-crypto-fallback.c b/block/blk-crypto-fallback.c index 8114eb4da6f3..d6c57887d770 100644 --- a/block/blk-crypto-fallback.c +++ b/block/blk-crypto-fallback.c @@ -488,21 +488,13 @@ out: return false; } -/** - * blk_crypto_start_using_mode() - Start using a crypto algorithm on a device - * @mode_num: the blk_crypto_mode we want to allocate ciphers for. - * @data_unit_size: the data unit size that will be used - * @q: the request queue for the device - * - * Upper layers must call this function to ensure that a the crypto API fallback - * has transforms for this algorithm, if they become necessary. - * - * Return: 0 on success and -err on error. +/* + * Prepare blk-crypto-fallback for the specified crypto mode. + * Returns -ENOPKG if the needed crypto API support is missing. */ -int blk_crypto_start_using_mode(enum blk_crypto_mode_num mode_num, - unsigned int data_unit_size, - struct request_queue *q) +int blk_crypto_fallback_start_using_mode(enum blk_crypto_mode_num mode_num) { + const char *cipher_str = blk_crypto_modes[mode_num].cipher_str; struct blk_crypto_keyslot *slotp; unsigned int i; int err = 0; @@ -515,25 +507,20 @@ int blk_crypto_start_using_mode(enum blk_crypto_mode_num mode_num, if (likely(smp_load_acquire(&tfms_inited[mode_num]))) return 0; - /* - * If the keyslot manager of the request queue supports this - * crypto mode, then we don't need to allocate this mode. - */ - if (keyslot_manager_crypto_mode_supported(q->ksm, mode_num, - data_unit_size)) - return 0; - mutex_lock(&tfms_init_lock); if (likely(tfms_inited[mode_num])) goto out; for (i = 0; i < blk_crypto_num_keyslots; i++) { slotp = &blk_crypto_keyslots[i]; - slotp->tfms[mode_num] = crypto_alloc_skcipher( - blk_crypto_modes[mode_num].cipher_str, - 0, 0); + slotp->tfms[mode_num] = crypto_alloc_skcipher(cipher_str, 0, 0); if (IS_ERR(slotp->tfms[mode_num])) { err = PTR_ERR(slotp->tfms[mode_num]); + if (err == -ENOENT) { + pr_warn_once("Missing crypto API support for \"%s\"\n", + cipher_str); + err = -ENOPKG; + } slotp->tfms[mode_num] = NULL; goto out_free_tfms; } @@ -559,7 +546,6 @@ out: mutex_unlock(&tfms_init_lock); return err; } -EXPORT_SYMBOL_GPL(blk_crypto_start_using_mode); int blk_crypto_fallback_evict_key(const struct blk_crypto_key *key) { @@ -615,9 +601,11 @@ int __init blk_crypto_fallback_init(void) crypto_mode_supported[i] = 0xFFFFFFFF; crypto_mode_supported[BLK_ENCRYPTION_MODE_INVALID] = 0; - blk_crypto_ksm = keyslot_manager_create(NULL, blk_crypto_num_keyslots, - &blk_crypto_ksm_ll_ops, - crypto_mode_supported, NULL); + blk_crypto_ksm = keyslot_manager_create( + NULL, blk_crypto_num_keyslots, + &blk_crypto_ksm_ll_ops, + BLK_CRYPTO_FEATURE_STANDARD_KEYS, + crypto_mode_supported, NULL); if (!blk_crypto_ksm) return -ENOMEM; diff --git a/block/blk-crypto-internal.h b/block/blk-crypto-internal.h index 40d826b743da..4da998c803f2 100644 --- a/block/blk-crypto-internal.h +++ b/block/blk-crypto-internal.h @@ -19,6 +19,8 @@ extern const struct blk_crypto_mode blk_crypto_modes[]; #ifdef CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK +int blk_crypto_fallback_start_using_mode(enum blk_crypto_mode_num mode_num); + int blk_crypto_fallback_submit_bio(struct bio **bio_ptr); bool blk_crypto_queue_decrypt_bio(struct bio *bio); @@ -29,6 +31,13 @@ bool bio_crypt_fallback_crypted(const struct bio_crypt_ctx *bc); #else /* CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK */ +static inline int +blk_crypto_fallback_start_using_mode(enum blk_crypto_mode_num mode_num) +{ + pr_warn_once("crypto API fallback is disabled\n"); + return -ENOPKG; +} + static inline bool bio_crypt_fallback_crypted(const struct bio_crypt_ctx *bc) { return false; diff --git a/block/blk-crypto.c b/block/blk-crypto.c index 88df1c0e7e5f..f56bbec1132f 100644 --- a/block/blk-crypto.c +++ b/block/blk-crypto.c @@ -109,7 +109,8 @@ int blk_crypto_submit_bio(struct bio **bio_ptr) /* Get device keyslot if supported */ if (keyslot_manager_crypto_mode_supported(q->ksm, bc->bc_key->crypto_mode, - bc->bc_key->data_unit_size)) { + bc->bc_key->data_unit_size, + bc->bc_key->is_hw_wrapped)) { err = bio_crypt_ctx_acquire_keyslot(bc, q->ksm); if (!err) return 0; @@ -232,6 +233,38 @@ int blk_crypto_init_key(struct blk_crypto_key *blk_key, } EXPORT_SYMBOL_GPL(blk_crypto_init_key); +/** + * blk_crypto_start_using_mode() - Start using blk-crypto on a device + * @crypto_mode: the crypto mode that will be used + * @data_unit_size: the data unit size that will be used + * @is_hw_wrapped_key: whether the key will be hardware-wrapped + * @q: the request queue for the device + * + * Upper layers must call this function to ensure that either the hardware + * supports the needed crypto settings, or the crypto API fallback has + * transforms for the needed mode allocated and ready to go. + * + * Return: 0 on success; -ENOPKG if the hardware doesn't support the crypto + * settings and blk-crypto-fallback is either disabled or the needed + * algorithm is disabled in the crypto API; or another -errno code. + */ +int blk_crypto_start_using_mode(enum blk_crypto_mode_num crypto_mode, + unsigned int data_unit_size, + bool is_hw_wrapped_key, + struct request_queue *q) +{ + if (keyslot_manager_crypto_mode_supported(q->ksm, crypto_mode, + data_unit_size, + is_hw_wrapped_key)) + return 0; + if (is_hw_wrapped_key) { + pr_warn_once("hardware doesn't support wrapped keys\n"); + return -EOPNOTSUPP; + } + return blk_crypto_fallback_start_using_mode(crypto_mode); +} +EXPORT_SYMBOL_GPL(blk_crypto_start_using_mode); + /** * blk_crypto_evict_key() - Evict a key from any inline encryption hardware * it may have been programmed into @@ -252,7 +285,8 @@ int blk_crypto_evict_key(struct request_queue *q, { if (q->ksm && keyslot_manager_crypto_mode_supported(q->ksm, key->crypto_mode, - key->data_unit_size)) + key->data_unit_size, + key->is_hw_wrapped)) return keyslot_manager_evict_key(q->ksm, key); return blk_crypto_fallback_evict_key(key); diff --git a/block/keyslot-manager.c b/block/keyslot-manager.c index 6b563c8602d0..d1dbac6e1a46 100644 --- a/block/keyslot-manager.c +++ b/block/keyslot-manager.c @@ -43,6 +43,7 @@ struct keyslot { struct keyslot_manager { unsigned int num_slots; struct keyslot_mgmt_ll_ops ksm_ll_ops; + unsigned int features; unsigned int crypto_mode_supported[BLK_ENCRYPTION_MODE_MAX]; void *ll_priv_data; @@ -135,6 +136,8 @@ static inline void keyslot_manager_hw_exit(struct keyslot_manager *ksm) * @ksm_ll_ops: The struct keyslot_mgmt_ll_ops for the device that this keyslot * manager will use to perform operations like programming and * evicting keys. + * @features: The supported features as a bitmask of BLK_CRYPTO_FEATURE_* flags. + * Most drivers should set BLK_CRYPTO_FEATURE_STANDARD_KEYS here. * @crypto_mode_supported: Array of size BLK_ENCRYPTION_MODE_MAX of * bitmasks that represents whether a crypto mode * and data unit size are supported. The i'th bit @@ -154,6 +157,7 @@ struct keyslot_manager *keyslot_manager_create( struct device *dev, unsigned int num_slots, const struct keyslot_mgmt_ll_ops *ksm_ll_ops, + unsigned int features, const unsigned int crypto_mode_supported[BLK_ENCRYPTION_MODE_MAX], void *ll_priv_data) { @@ -175,6 +179,7 @@ struct keyslot_manager *keyslot_manager_create( ksm->num_slots = num_slots; ksm->ksm_ll_ops = *ksm_ll_ops; + ksm->features = features; memcpy(ksm->crypto_mode_supported, crypto_mode_supported, sizeof(ksm->crypto_mode_supported)); ksm->ll_priv_data = ll_priv_data; @@ -381,23 +386,24 @@ void keyslot_manager_put_slot(struct keyslot_manager *ksm, unsigned int slot) } /** - * keyslot_manager_crypto_mode_supported() - Find out if a crypto_mode/data - * unit size combination is supported - * by a ksm. + * keyslot_manager_crypto_mode_supported() - Find out if a crypto_mode / + * data unit size / is_hw_wrapped_key + * combination is supported by a ksm. * @ksm: The keyslot manager to check * @crypto_mode: The crypto mode to check for. * @data_unit_size: The data_unit_size for the mode. + * @is_hw_wrapped_key: Whether a hardware-wrapped key will be used. * * Calls and returns the result of the crypto_mode_supported function specified * by the ksm. * * Context: Process context. - * Return: Whether or not this ksm supports the specified crypto_mode/ - * data_unit_size combo. + * Return: Whether or not this ksm supports the specified crypto settings. */ bool keyslot_manager_crypto_mode_supported(struct keyslot_manager *ksm, enum blk_crypto_mode_num crypto_mode, - unsigned int data_unit_size) + unsigned int data_unit_size, + bool is_hw_wrapped_key) { if (!ksm) return false; @@ -405,6 +411,13 @@ bool keyslot_manager_crypto_mode_supported(struct keyslot_manager *ksm, return false; if (WARN_ON(!is_power_of_2(data_unit_size))) return false; + if (is_hw_wrapped_key) { + if (!(ksm->features & BLK_CRYPTO_FEATURE_WRAPPED_KEYS)) + return false; + } else { + if (!(ksm->features & BLK_CRYPTO_FEATURE_STANDARD_KEYS)) + return false; + } return ksm->crypto_mode_supported[crypto_mode] & data_unit_size; } @@ -520,6 +533,7 @@ EXPORT_SYMBOL_GPL(keyslot_manager_destroy); * keyslot_manager_create_passthrough() - Create a passthrough keyslot manager * @dev: Device for runtime power management (NULL if none) * @ksm_ll_ops: The struct keyslot_mgmt_ll_ops + * @features: Bitmask of BLK_CRYPTO_FEATURE_* flags * @crypto_mode_supported: Bitmasks for supported encryption modes * @ll_priv_data: Private data passed as is to the functions in ksm_ll_ops. * @@ -537,6 +551,7 @@ EXPORT_SYMBOL_GPL(keyslot_manager_destroy); struct keyslot_manager *keyslot_manager_create_passthrough( struct device *dev, const struct keyslot_mgmt_ll_ops *ksm_ll_ops, + unsigned int features, const unsigned int crypto_mode_supported[BLK_ENCRYPTION_MODE_MAX], void *ll_priv_data) { @@ -547,6 +562,7 @@ struct keyslot_manager *keyslot_manager_create_passthrough( return NULL; ksm->ksm_ll_ops = *ksm_ll_ops; + ksm->features = features; memcpy(ksm->crypto_mode_supported, crypto_mode_supported, sizeof(ksm->crypto_mode_supported)); ksm->ll_priv_data = ll_priv_data; @@ -575,11 +591,13 @@ void keyslot_manager_intersect_modes(struct keyslot_manager *parent, if (child) { unsigned int i; + parent->features &= child->features; for (i = 0; i < ARRAY_SIZE(child->crypto_mode_supported); i++) { parent->crypto_mode_supported[i] &= child->crypto_mode_supported[i]; } } else { + parent->features = 0; memset(parent->crypto_mode_supported, 0, sizeof(parent->crypto_mode_supported)); } diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 4771e218d5f1..972227eae22e 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -1342,6 +1342,8 @@ Run: error = dpm_run_callback(callback, dev, state, info); if (error) { async_error = error; + log_suspend_abort_reason("Callback failed on %s in %pS returned %d", + dev_name(dev), callback, error); goto Complete; } @@ -1549,6 +1551,8 @@ Run: error = dpm_run_callback(callback, dev, state, info); if (error) { async_error = error; + log_suspend_abort_reason("Callback failed on %s in %pS returned %d", + dev_name(dev), callback, error); goto Complete; } dpm_propagate_wakeup_to_parent(dev); @@ -1716,7 +1720,6 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) pm_callback_t callback = NULL; const char *info = NULL; int error = 0; - char suspend_abort[MAX_SUSPEND_ABORT_LEN]; DECLARE_DPM_WATCHDOG_ON_STACK(wd); TRACE_DEVICE(dev); @@ -1740,9 +1743,6 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) if (pm_wakeup_pending()) { dev->power.direct_complete = false; - pm_get_active_wakeup_sources(suspend_abort, - MAX_SUSPEND_ABORT_LEN); - log_suspend_abort_reason(suspend_abort); async_error = -EBUSY; goto Complete; } @@ -1819,6 +1819,9 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) dpm_propagate_wakeup_to_parent(dev); dpm_clear_superiors_direct_complete(dev); + } else { + log_suspend_abort_reason("Callback failed on %s in %pS returned %d", + dev_name(dev), callback, error); } device_unlock(dev); @@ -2028,6 +2031,8 @@ int dpm_prepare(pm_message_t state) } pr_info("Device %s not prepared for power transition: code %d\n", dev_name(dev), error); + log_suspend_abort_reason("Device %s not prepared for power transition: code %d", + dev_name(dev), error); dpm_save_failed_dev(dev_name(dev)); put_device(dev); break; diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c index 06b3ce836a24..c45e3b1954de 100644 --- a/drivers/base/power/wakeup.c +++ b/drivers/base/power/wakeup.c @@ -15,7 +15,9 @@ #include #include #include -#include +#include +#include +#include #include #include "power.h" @@ -883,6 +885,7 @@ bool pm_wakeup_pending(void) { unsigned long flags; bool ret = false; + char suspend_abort[MAX_SUSPEND_ABORT_LEN]; raw_spin_lock_irqsave(&events_lock, flags); if (events_check_enabled) { @@ -897,6 +900,10 @@ bool pm_wakeup_pending(void) if (ret) { pm_pr_dbg("Wakeup pending, aborting suspend\n"); pm_print_active_wakeup_sources(); + pm_get_active_wakeup_sources(suspend_abort, + MAX_SUSPEND_ABORT_LEN); + log_suspend_abort_reason(suspend_abort); + pr_info("PM: %s\n", suspend_abort); } return ret || atomic_read(&pm_abort_suspend) > 0; @@ -924,6 +931,18 @@ void pm_wakeup_clear(bool reset) void pm_system_irq_wakeup(unsigned int irq_number) { if (pm_wakeup_irq == 0) { + struct irq_desc *desc; + const char *name = "null"; + + desc = irq_to_desc(irq_number); + if (desc == NULL) + name = "stray irq"; + else if (desc->action && desc->action->name) + name = desc->action->name; + + log_irq_wakeup_reason(irq_number); + pr_warn("%s: %d triggered %s\n", __func__, irq_number, name); + pm_wakeup_irq = irq_number; pm_system_wakeup(); } diff --git a/drivers/block/loop.c b/drivers/block/loop.c index ef6e251857c8..40961d9dd061 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -214,7 +214,8 @@ static void __loop_update_dio(struct loop_device *lo, bool dio) * LO_FLAGS_READ_ONLY, both are set from kernel, and losetup * will get updated by ioctl(LOOP_GET_STATUS) */ - blk_mq_freeze_queue(lo->lo_queue); + if (lo->lo_state == Lo_bound) + blk_mq_freeze_queue(lo->lo_queue); lo->use_dio = use_dio; if (use_dio) { blk_queue_flag_clear(QUEUE_FLAG_NOMERGES, lo->lo_queue); @@ -223,7 +224,8 @@ static void __loop_update_dio(struct loop_device *lo, bool dio) blk_queue_flag_set(QUEUE_FLAG_NOMERGES, lo->lo_queue); lo->lo_flags &= ~LO_FLAGS_DIRECT_IO; } - blk_mq_unfreeze_queue(lo->lo_queue); + if (lo->lo_state == Lo_bound) + blk_mq_unfreeze_queue(lo->lo_queue); } static int @@ -1536,16 +1538,16 @@ static int loop_set_block_size(struct loop_device *lo, unsigned long arg) if (arg < 512 || arg > PAGE_SIZE || !is_power_of_2(arg)) return -EINVAL; - if (lo->lo_queue->limits.logical_block_size != arg) { - sync_blockdev(lo->lo_device); - kill_bdev(lo->lo_device); - } + if (lo->lo_queue->limits.logical_block_size == arg) + return 0; + + sync_blockdev(lo->lo_device); + kill_bdev(lo->lo_device); blk_mq_freeze_queue(lo->lo_queue); /* kill_bdev should have truncated all the pages */ - if (lo->lo_queue->limits.logical_block_size != arg && - lo->lo_device->bd_inode->i_mapping->nrpages) { + if (lo->lo_device->bd_inode->i_mapping->nrpages) { err = -EAGAIN; pr_warn("%s: loop%d (%s) has still dirty pages (nrpages=%lu)\n", __func__, lo->lo_number, lo->lo_file_name, diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index d813c7c0d626..2d9814984b60 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -106,6 +106,8 @@ bool have_governor_per_policy(void) } EXPORT_SYMBOL_GPL(have_governor_per_policy); +static struct kobject *cpufreq_global_kobject; + struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy) { if (have_governor_per_policy()) @@ -2764,9 +2766,6 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver) } EXPORT_SYMBOL_GPL(cpufreq_unregister_driver); -struct kobject *cpufreq_global_kobject; -EXPORT_SYMBOL(cpufreq_global_kobject); - static int __init cpufreq_core_init(void) { if (cpufreq_disabled()) diff --git a/drivers/dma/sprd-dma.c b/drivers/dma/sprd-dma.c index a1bc7580b6a0..d10e1769b83e 100644 --- a/drivers/dma/sprd-dma.c +++ b/drivers/dma/sprd-dma.c @@ -486,6 +486,28 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan) return 0; } +static void sprd_dma_set_pending(struct sprd_dma_chn *schan, bool enable) +{ + struct sprd_dma_dev *sdev = to_sprd_dma_dev(&schan->vc.chan); + u32 reg, val, req_id; + + if (schan->dev_id == SPRD_DMA_SOFTWARE_UID) + return; + + /* The DMA request id always starts from 0. */ + req_id = schan->dev_id - 1; + + if (req_id < 32) { + reg = SPRD_DMA_GLB_REQ_PEND0_EN; + val = BIT(req_id); + } else { + reg = SPRD_DMA_GLB_REQ_PEND1_EN; + val = BIT(req_id - 32); + } + + sprd_dma_glb_update(sdev, reg, val, enable ? val : 0); +} + static void sprd_dma_set_chn_config(struct sprd_dma_chn *schan, struct sprd_dma_desc *sdesc) { @@ -532,6 +554,7 @@ static void sprd_dma_start(struct sprd_dma_chn *schan) */ sprd_dma_set_chn_config(schan, schan->cur_desc); sprd_dma_set_uid(schan); + sprd_dma_set_pending(schan, true); sprd_dma_enable_chn(schan); if (schan->dev_id == SPRD_DMA_SOFTWARE_UID && @@ -543,6 +566,7 @@ static void sprd_dma_start(struct sprd_dma_chn *schan) static void sprd_dma_stop(struct sprd_dma_chn *schan) { sprd_dma_stop_and_disable(schan); + sprd_dma_set_pending(schan, false); sprd_dma_unset_uid(schan); sprd_dma_clear_int(schan); schan->cur_desc = NULL; diff --git a/drivers/extcon/extcon-axp288.c b/drivers/extcon/extcon-axp288.c index 415afaf479e7..0840c0f1bf2e 100644 --- a/drivers/extcon/extcon-axp288.c +++ b/drivers/extcon/extcon-axp288.c @@ -423,9 +423,40 @@ static int axp288_extcon_probe(struct platform_device *pdev) /* Start charger cable type detection */ axp288_extcon_enable(info); + device_init_wakeup(dev, true); + platform_set_drvdata(pdev, info); + return 0; } +static int __maybe_unused axp288_extcon_suspend(struct device *dev) +{ + struct axp288_extcon_info *info = dev_get_drvdata(dev); + + if (device_may_wakeup(dev)) + enable_irq_wake(info->irq[VBUS_RISING_IRQ]); + + return 0; +} + +static int __maybe_unused axp288_extcon_resume(struct device *dev) +{ + struct axp288_extcon_info *info = dev_get_drvdata(dev); + + /* + * Wakeup when a charger is connected to do charger-type + * connection and generate an extcon event which makes the + * axp288 charger driver set the input current limit. + */ + if (device_may_wakeup(dev)) + disable_irq_wake(info->irq[VBUS_RISING_IRQ]); + + return 0; +} + +static SIMPLE_DEV_PM_OPS(axp288_extcon_pm_ops, axp288_extcon_suspend, + axp288_extcon_resume); + static const struct platform_device_id axp288_extcon_table[] = { { .name = "axp288_extcon" }, {}, @@ -437,6 +468,7 @@ static struct platform_driver axp288_extcon_driver = { .id_table = axp288_extcon_table, .driver = { .name = "axp288_extcon", + .pm = &axp288_extcon_pm_ops, }, }; diff --git a/drivers/gpio/gpio-eic-sprd.c b/drivers/gpio/gpio-eic-sprd.c index bb287f35cf40..8c9757774010 100644 --- a/drivers/gpio/gpio-eic-sprd.c +++ b/drivers/gpio/gpio-eic-sprd.c @@ -569,6 +569,7 @@ static int sprd_eic_probe(struct platform_device *pdev) const struct sprd_eic_variant_data *pdata; struct gpio_irq_chip *irq; struct sprd_eic *sprd_eic; + struct resource *res; int ret, i; pdata = of_device_get_match_data(&pdev->dev); @@ -595,9 +596,13 @@ static int sprd_eic_probe(struct platform_device *pdev) * have one bank EIC, thus base[1] and base[2] can be * optional. */ - sprd_eic->base[i] = devm_platform_ioremap_resource(pdev, i); - if (IS_ERR(sprd_eic->base[i])) + res = platform_get_resource(pdev, IORESOURCE_MEM, i); + if (!res) continue; + + sprd_eic->base[i] = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(sprd_eic->base[i])) + return PTR_ERR(sprd_eic->base[i]); } sprd_eic->chip.label = sprd_eic_label_name[sprd_eic->type]; diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index 93b3500e522b..4f0f0de83293 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c @@ -1375,7 +1375,7 @@ static int vcn_v1_0_set_clockgating_state(void *handle, if (enable) { /* wait for STATUS to clear */ - if (vcn_v1_0_is_idle(handle)) + if (!vcn_v1_0_is_idle(handle)) return -EBUSY; vcn_v1_0_enable_clock_gating(adev); } else { 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 0ab890c927ec..6dd2334dd5e6 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 @@ -2879,6 +2879,17 @@ static bool retrieve_link_cap(struct dc_link *link) sink_id.ieee_device_id, sizeof(sink_id.ieee_device_id)); + /* Quirk Apple MBP 2017 15" Retina panel: Wrong DP_MAX_LINK_RATE */ + { + uint8_t str_mbp_2017[] = { 101, 68, 21, 101, 98, 97 }; + + if ((link->dpcd_caps.sink_dev_id == 0x0010fa) && + !memcmp(link->dpcd_caps.sink_dev_id_str, str_mbp_2017, + sizeof(str_mbp_2017))) { + link->reported_link_cap.link_rate = 0x0c; + } + } + core_link_read_dpcd( link, DP_SINK_HW_REVISION_START, diff --git a/drivers/gpu/drm/bochs/bochs_hw.c b/drivers/gpu/drm/bochs/bochs_hw.c index e567bdfa2ab8..bb1391784caf 100644 --- a/drivers/gpu/drm/bochs/bochs_hw.c +++ b/drivers/gpu/drm/bochs/bochs_hw.c @@ -156,10 +156,8 @@ int bochs_hw_init(struct drm_device *dev) size = min(size, mem); } - if (pci_request_region(pdev, 0, "bochs-drm") != 0) { - DRM_ERROR("Cannot request framebuffer\n"); - return -EBUSY; - } + if (pci_request_region(pdev, 0, "bochs-drm") != 0) + DRM_WARN("Cannot request framebuffer, boot fb still active?\n"); bochs->fb_map = ioremap(addr, size); if (bochs->fb_map == NULL) { diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index f1c714acc280..3ff6fbd79b12 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c @@ -129,11 +129,6 @@ #define TCOBASE 0x050 #define TCOCTL 0x054 -#define ACPIBASE 0x040 -#define ACPIBASE_SMI_OFF 0x030 -#define ACPICTRL 0x044 -#define ACPICTRL_EN 0x080 - #define SBREG_BAR 0x10 #define SBREG_SMBCTRL 0xc6000c #define SBREG_SMBCTRL_DNV 0xcf000c @@ -1544,7 +1539,7 @@ i801_add_tco_spt(struct i801_priv *priv, struct pci_dev *pci_dev, pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, hidden); spin_unlock(&p2sb_spinlock); - res = &tco_res[ICH_RES_MEM_OFF]; + res = &tco_res[1]; if (pci_dev->device == PCI_DEVICE_ID_INTEL_DNV_SMBUS) res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL_DNV; else @@ -1554,7 +1549,7 @@ i801_add_tco_spt(struct i801_priv *priv, struct pci_dev *pci_dev, res->flags = IORESOURCE_MEM; return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, - tco_res, 3, &spt_tco_platform_data, + tco_res, 2, &spt_tco_platform_data, sizeof(spt_tco_platform_data)); } @@ -1567,17 +1562,16 @@ static struct platform_device * i801_add_tco_cnl(struct i801_priv *priv, struct pci_dev *pci_dev, struct resource *tco_res) { - return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, - tco_res, 2, &cnl_tco_platform_data, - sizeof(cnl_tco_platform_data)); + return platform_device_register_resndata(&pci_dev->dev, + "iTCO_wdt", -1, tco_res, 1, &cnl_tco_platform_data, + sizeof(cnl_tco_platform_data)); } static void i801_add_tco(struct i801_priv *priv) { - u32 base_addr, tco_base, tco_ctl, ctrl_val; struct pci_dev *pci_dev = priv->pci_dev; - struct resource tco_res[3], *res; - unsigned int devfn; + struct resource tco_res[2], *res; + u32 tco_base, tco_ctl; /* If we have ACPI based watchdog use that instead */ if (acpi_has_watchdog()) @@ -1592,30 +1586,15 @@ static void i801_add_tco(struct i801_priv *priv) return; memset(tco_res, 0, sizeof(tco_res)); - - res = &tco_res[ICH_RES_IO_TCO]; + /* + * Always populate the main iTCO IO resource here. The second entry + * for NO_REBOOT MMIO is filled by the SPT specific function. + */ + res = &tco_res[0]; res->start = tco_base & ~1; res->end = res->start + 32 - 1; res->flags = IORESOURCE_IO; - /* - * Power Management registers. - */ - devfn = PCI_DEVFN(PCI_SLOT(pci_dev->devfn), 2); - pci_bus_read_config_dword(pci_dev->bus, devfn, ACPIBASE, &base_addr); - - res = &tco_res[ICH_RES_IO_SMI]; - res->start = (base_addr & ~1) + ACPIBASE_SMI_OFF; - res->end = res->start + 3; - res->flags = IORESOURCE_IO; - - /* - * Enable the ACPI I/O space. - */ - pci_bus_read_config_dword(pci_dev->bus, devfn, ACPICTRL, &ctrl_val); - ctrl_val |= ACPICTRL_EN; - pci_bus_write_config_dword(pci_dev->bus, devfn, ACPICTRL, ctrl_val); - if (priv->features & FEATURE_TCO_CNL) priv->tco_pdev = i801_add_tco_cnl(priv, pci_dev, tco_res); else diff --git a/drivers/infiniband/hw/hfi1/user_sdma.c b/drivers/infiniband/hw/hfi1/user_sdma.c index c2f0d9ba93de..13e4203497b3 100644 --- a/drivers/infiniband/hw/hfi1/user_sdma.c +++ b/drivers/infiniband/hw/hfi1/user_sdma.c @@ -141,6 +141,7 @@ static int defer_packet_queue( */ xchg(&pq->state, SDMA_PKT_Q_DEFERRED); if (list_empty(&pq->busy.list)) { + pq->busy.lock = &sde->waitlock; iowait_get_priority(&pq->busy); iowait_queue(pkts_sent, &pq->busy, &sde->dmawait); } @@ -155,6 +156,7 @@ static void activate_packet_queue(struct iowait *wait, int reason) { struct hfi1_user_sdma_pkt_q *pq = container_of(wait, struct hfi1_user_sdma_pkt_q, busy); + pq->busy.lock = NULL; xchg(&pq->state, SDMA_PKT_Q_ACTIVE); wake_up(&wait->wait_dma); }; @@ -256,6 +258,21 @@ pq_reqs_nomem: return ret; } +static void flush_pq_iowait(struct hfi1_user_sdma_pkt_q *pq) +{ + unsigned long flags; + seqlock_t *lock = pq->busy.lock; + + if (!lock) + return; + write_seqlock_irqsave(lock, flags); + if (!list_empty(&pq->busy.list)) { + list_del_init(&pq->busy.list); + pq->busy.lock = NULL; + } + write_sequnlock_irqrestore(lock, flags); +} + int hfi1_user_sdma_free_queues(struct hfi1_filedata *fd, struct hfi1_ctxtdata *uctxt) { @@ -281,6 +298,7 @@ int hfi1_user_sdma_free_queues(struct hfi1_filedata *fd, kfree(pq->reqs); kfree(pq->req_in_use); kmem_cache_destroy(pq->txreq_cache); + flush_pq_iowait(pq); kfree(pq); } else { spin_unlock(&fd->pq_rcu_lock); @@ -587,11 +605,12 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd, if (ret < 0) { if (ret != -EBUSY) goto free_req; - wait_event_interruptible_timeout( + if (wait_event_interruptible_timeout( pq->busy.wait_dma, - (pq->state == SDMA_PKT_Q_ACTIVE), + pq->state == SDMA_PKT_Q_ACTIVE, msecs_to_jiffies( - SDMA_IOWAIT_TIMEOUT)); + SDMA_IOWAIT_TIMEOUT)) <= 0) + flush_pq_iowait(pq); } } *count += idx; diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index b3d133b549fb..d679edbcf450 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -18,6 +18,8 @@ #include #include #include +#include + #include #include @@ -648,6 +650,9 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs err = handle_domain_irq(gic_data.domain, irqnr, regs); if (err) { WARN_ONCE(true, "Unexpected interrupt received!\n"); + log_abnormal_wakeup_reason( + "unexpected HW IRQ %u", irqnr); + gic_deactivate_unhandled(irqnr); } return; diff --git a/drivers/md/dm-default-key.c b/drivers/md/dm-default-key.c index 2420e9898d09..73120426a1a0 100644 --- a/drivers/md/dm-default-key.c +++ b/drivers/md/dm-default-key.c @@ -239,6 +239,7 @@ static int default_key_ctr(struct dm_target *ti, unsigned int argc, char **argv) } err = blk_crypto_start_using_mode(cipher->mode_num, dkc->sector_size, + dkc->is_hw_wrapped, dkc->dev->bdev->bd_queue); if (err) { ti->error = "Error starting to use blk-crypto"; diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 502de5255d3b..e36a3272fe3c 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1741,8 +1741,9 @@ static blk_qc_t dm_process_bio(struct mapped_device *md, * won't be imposed. */ if (current->bio_list) { - blk_queue_split(md->queue, &bio); - if (!is_abnormal_io(bio)) + if (is_abnormal_io(bio)) + blk_queue_split(md->queue, &bio); + else dm_queue_split(md, ti, &bio); } @@ -2370,16 +2371,21 @@ static struct keyslot_mgmt_ll_ops dm_ksm_ll_ops = { static int dm_init_inline_encryption(struct mapped_device *md) { + unsigned int features; unsigned int mode_masks[BLK_ENCRYPTION_MODE_MAX]; /* - * Start out with all crypto mode support bits set. Any unsupported - * bits will be cleared later when calculating the device restrictions. + * Initially declare support for all crypto settings. Anything + * unsupported by a child device will be removed later when calculating + * the device restrictions. */ + features = BLK_CRYPTO_FEATURE_STANDARD_KEYS | + BLK_CRYPTO_FEATURE_WRAPPED_KEYS; memset(mode_masks, 0xFF, sizeof(mode_masks)); md->queue->ksm = keyslot_manager_create_passthrough(NULL, &dm_ksm_ll_ops, + features, mode_masks, md); if (!md->queue->ksm) return -ENOMEM; diff --git a/drivers/mfd/sprd-sc27xx-spi.c b/drivers/mfd/sprd-sc27xx-spi.c index c0529a1cd5ea..ebdf2f11ae28 100644 --- a/drivers/mfd/sprd-sc27xx-spi.c +++ b/drivers/mfd/sprd-sc27xx-spi.c @@ -10,6 +10,7 @@ #include #include #include +#include #define SPRD_PMIC_INT_MASK_STATUS 0x0 #define SPRD_PMIC_INT_RAW_STATUS 0x4 @@ -17,6 +18,16 @@ #define SPRD_SC2731_IRQ_BASE 0x140 #define SPRD_SC2731_IRQ_NUMS 16 +#define SPRD_SC2731_CHG_DET 0xedc + +/* PMIC charger detection definition */ +#define SPRD_PMIC_CHG_DET_DELAY_US 200000 +#define SPRD_PMIC_CHG_DET_TIMEOUT 2000000 +#define SPRD_PMIC_CHG_DET_DONE BIT(11) +#define SPRD_PMIC_SDP_TYPE BIT(7) +#define SPRD_PMIC_DCP_TYPE BIT(6) +#define SPRD_PMIC_CDP_TYPE BIT(5) +#define SPRD_PMIC_CHG_TYPE_MASK GENMASK(7, 5) struct sprd_pmic { struct regmap *regmap; @@ -24,12 +35,14 @@ struct sprd_pmic { struct regmap_irq *irqs; struct regmap_irq_chip irq_chip; struct regmap_irq_chip_data *irq_data; + const struct sprd_pmic_data *pdata; int irq; }; struct sprd_pmic_data { u32 irq_base; u32 num_irqs; + u32 charger_det; }; /* @@ -40,8 +53,46 @@ struct sprd_pmic_data { static const struct sprd_pmic_data sc2731_data = { .irq_base = SPRD_SC2731_IRQ_BASE, .num_irqs = SPRD_SC2731_IRQ_NUMS, + .charger_det = SPRD_SC2731_CHG_DET, }; +enum usb_charger_type sprd_pmic_detect_charger_type(struct device *dev) +{ + struct spi_device *spi = to_spi_device(dev); + struct sprd_pmic *ddata = spi_get_drvdata(spi); + const struct sprd_pmic_data *pdata = ddata->pdata; + enum usb_charger_type type; + u32 val; + int ret; + + ret = regmap_read_poll_timeout(ddata->regmap, pdata->charger_det, val, + (val & SPRD_PMIC_CHG_DET_DONE), + SPRD_PMIC_CHG_DET_DELAY_US, + SPRD_PMIC_CHG_DET_TIMEOUT); + if (ret) { + dev_err(&spi->dev, "failed to detect charger type\n"); + return UNKNOWN_TYPE; + } + + switch (val & SPRD_PMIC_CHG_TYPE_MASK) { + case SPRD_PMIC_CDP_TYPE: + type = CDP_TYPE; + break; + case SPRD_PMIC_DCP_TYPE: + type = DCP_TYPE; + break; + case SPRD_PMIC_SDP_TYPE: + type = SDP_TYPE; + break; + default: + type = UNKNOWN_TYPE; + break; + } + + return type; +} +EXPORT_SYMBOL_GPL(sprd_pmic_detect_charger_type); + static const struct mfd_cell sprd_pmic_devs[] = { { .name = "sc27xx-wdt", @@ -181,6 +232,7 @@ static int sprd_pmic_probe(struct spi_device *spi) spi_set_drvdata(spi, ddata); ddata->dev = &spi->dev; ddata->irq = spi->irq; + ddata->pdata = pdata; ddata->irq_chip.name = dev_name(&spi->dev); ddata->irq_chip.status_base = diff --git a/drivers/misc/cardreader/rts5227.c b/drivers/misc/cardreader/rts5227.c index 423fecc19fc4..3a9467aaa435 100644 --- a/drivers/misc/cardreader/rts5227.c +++ b/drivers/misc/cardreader/rts5227.c @@ -394,6 +394,7 @@ static const struct pcr_ops rts522a_pcr_ops = { void rts522a_init_params(struct rtsx_pcr *pcr) { rts5227_init_params(pcr); + pcr->ops = &rts522a_pcr_ops; pcr->tx_initial_phase = SET_CLOCK_PHASE(20, 20, 11); pcr->reg_pm_ctrl3 = RTS522A_PM_CTRL3; diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h index 69d9b1736bf9..e56dc4754064 100644 --- a/drivers/misc/mei/hw-me-regs.h +++ b/drivers/misc/mei/hw-me-regs.h @@ -87,6 +87,8 @@ #define MEI_DEV_ID_CMP_H 0x06e0 /* Comet Lake H */ #define MEI_DEV_ID_CMP_H_3 0x06e4 /* Comet Lake H 3 (iTouch) */ +#define MEI_DEV_ID_CDF 0x18D3 /* Cedar Fork */ + #define MEI_DEV_ID_ICP_LP 0x34E0 /* Ice Lake Point LP */ #define MEI_DEV_ID_TGP_LP 0xA0E0 /* Tiger Lake Point LP */ diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index 309cb8a23381..75ab2ffbf235 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c @@ -109,6 +109,8 @@ static const struct pci_device_id mei_me_pci_tbl[] = { {MEI_PCI_DEVICE(MEI_DEV_ID_MCC, MEI_ME_PCH12_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_MCC_4, MEI_ME_PCH8_CFG)}, + {MEI_PCI_DEVICE(MEI_DEV_ID_CDF, MEI_ME_PCH8_CFG)}, + /* required last entry */ {0, } }; diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c index 6e208a060a58..1154f0435b0a 100644 --- a/drivers/misc/pci_endpoint_test.c +++ b/drivers/misc/pci_endpoint_test.c @@ -98,6 +98,7 @@ struct pci_endpoint_test { struct completion irq_raised; int last_irq; int num_irqs; + int irq_type; /* mutex to protect the ioctls */ struct mutex mutex; struct miscdevice miscdev; @@ -157,6 +158,7 @@ static void pci_endpoint_test_free_irq_vectors(struct pci_endpoint_test *test) struct pci_dev *pdev = test->pdev; pci_free_irq_vectors(pdev); + test->irq_type = IRQ_TYPE_UNDEFINED; } static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test, @@ -191,6 +193,8 @@ static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test, irq = 0; res = false; } + + test->irq_type = type; test->num_irqs = irq; return res; @@ -330,6 +334,7 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size) dma_addr_t orig_dst_phys_addr; size_t offset; size_t alignment = test->alignment; + int irq_type = test->irq_type; u32 src_crc32; u32 dst_crc32; @@ -426,6 +431,7 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size) dma_addr_t orig_phys_addr; size_t offset; size_t alignment = test->alignment; + int irq_type = test->irq_type; u32 crc32; if (size > SIZE_MAX - alignment) @@ -494,6 +500,7 @@ static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size) dma_addr_t orig_phys_addr; size_t offset; size_t alignment = test->alignment; + int irq_type = test->irq_type; u32 crc32; if (size > SIZE_MAX - alignment) @@ -555,7 +562,7 @@ static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test, return false; } - if (irq_type == req_irq_type) + if (test->irq_type == req_irq_type) return true; pci_endpoint_test_release_irq(test); @@ -567,12 +574,10 @@ static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test, if (!pci_endpoint_test_request_irq(test)) goto err; - irq_type = req_irq_type; return true; err: pci_endpoint_test_free_irq_vectors(test); - irq_type = IRQ_TYPE_UNDEFINED; return false; } @@ -633,7 +638,7 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev, { int err; int id; - char name[20]; + char name[24]; enum pci_barno bar; void __iomem *base; struct device *dev = &pdev->dev; @@ -652,6 +657,7 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev, test->test_reg_bar = 0; test->alignment = 0; test->pdev = pdev; + test->irq_type = IRQ_TYPE_UNDEFINED; if (no_msi) irq_type = IRQ_TYPE_LEGACY; diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 95b41c0891d0..2af8c6045fa2 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -168,6 +168,11 @@ MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device"); static inline int mmc_blk_part_switch(struct mmc_card *card, unsigned int part_type); +static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, + struct mmc_card *card, + int disable_multi, + struct mmc_queue *mq); +static void mmc_blk_hsq_req_done(struct mmc_request *mrq); static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk) { @@ -1532,9 +1537,30 @@ static int mmc_blk_cqe_issue_flush(struct mmc_queue *mq, struct request *req) return mmc_blk_cqe_start_req(mq->card->host, mrq); } +static int mmc_blk_hsq_issue_rw_rq(struct mmc_queue *mq, struct request *req) +{ + struct mmc_queue_req *mqrq = req_to_mmc_queue_req(req); + struct mmc_host *host = mq->card->host; + int err; + + mmc_blk_rw_rq_prep(mqrq, mq->card, 0, mq); + mqrq->brq.mrq.done = mmc_blk_hsq_req_done; + mmc_pre_req(host, &mqrq->brq.mrq); + + err = mmc_cqe_start_req(host, &mqrq->brq.mrq); + if (err) + mmc_post_req(host, &mqrq->brq.mrq, err); + + return err; +} + static int mmc_blk_cqe_issue_rw_rq(struct mmc_queue *mq, struct request *req) { struct mmc_queue_req *mqrq = req_to_mmc_queue_req(req); + struct mmc_host *host = mq->card->host; + + if (host->hsq_enabled) + return mmc_blk_hsq_issue_rw_rq(mq, req); mmc_blk_data_prep(mq, mqrq, 0, NULL, NULL); @@ -1920,6 +1946,41 @@ static void mmc_blk_urgent_bkops(struct mmc_queue *mq, mmc_run_bkops(mq->card); } +static void mmc_blk_hsq_req_done(struct mmc_request *mrq) +{ + struct mmc_queue_req *mqrq = + container_of(mrq, struct mmc_queue_req, brq.mrq); + struct request *req = mmc_queue_req_to_req(mqrq); + struct request_queue *q = req->q; + struct mmc_queue *mq = q->queuedata; + struct mmc_host *host = mq->card->host; + unsigned long flags; + + if (mmc_blk_rq_error(&mqrq->brq) || + mmc_blk_urgent_bkops_needed(mq, mqrq)) { + spin_lock_irqsave(&mq->lock, flags); + mq->recovery_needed = true; + mq->recovery_req = req; + spin_unlock_irqrestore(&mq->lock, flags); + + host->cqe_ops->cqe_recovery_start(host); + + schedule_work(&mq->recovery_work); + return; + } + + mmc_blk_rw_reset_success(mq, req); + + /* + * Block layer timeouts race with completions which means the normal + * completion path cannot be used during recovery. + */ + if (mq->in_recovery) + mmc_blk_cqe_complete_rq(mq, req); + else + blk_mq_complete_request(req); +} + void mmc_blk_mq_complete(struct request *req) { struct mmc_queue *mq = req->q->queuedata; diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index b7159e243323..b975d6d0116f 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -1852,15 +1852,19 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, */ card->reenable_cmdq = card->ext_csd.cmdq_en; - if (card->ext_csd.cmdq_en && !host->cqe_enabled) { + if (host->cqe_ops && !host->cqe_enabled) { err = host->cqe_ops->cqe_enable(host, card); - if (err) { - pr_err("%s: Failed to enable CQE, error %d\n", - mmc_hostname(host), err); - } else { + if (!err) { host->cqe_enabled = true; - pr_info("%s: Command Queue Engine enabled\n", - mmc_hostname(host)); + + if (card->ext_csd.cmdq_en) { + pr_info("%s: Command Queue Engine enabled\n", + mmc_hostname(host)); + } else { + host->hsq_enabled = true; + pr_info("%s: Host Software Queue enabled\n", + mmc_hostname(host)); + } } } diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c index 9edc08685e86..25bee3daf9e2 100644 --- a/drivers/mmc/core/queue.c +++ b/drivers/mmc/core/queue.c @@ -62,7 +62,7 @@ enum mmc_issue_type mmc_issue_type(struct mmc_queue *mq, struct request *req) { struct mmc_host *host = mq->card->host; - if (mq->use_cqe) + if (mq->use_cqe && !host->hsq_enabled) return mmc_cqe_issue_type(host, req); if (req_op(req) == REQ_OP_READ || req_op(req) == REQ_OP_WRITE) @@ -124,12 +124,14 @@ static enum blk_eh_timer_return mmc_mq_timed_out(struct request *req, { struct request_queue *q = req->q; struct mmc_queue *mq = q->queuedata; + struct mmc_card *card = mq->card; + struct mmc_host *host = card->host; unsigned long flags; int ret; spin_lock_irqsave(&mq->lock, flags); - if (mq->recovery_needed || !mq->use_cqe) + if (mq->recovery_needed || !mq->use_cqe || host->hsq_enabled) ret = BLK_EH_RESET_TIMER; else ret = mmc_cqe_timed_out(req); @@ -144,12 +146,13 @@ static void mmc_mq_recovery_handler(struct work_struct *work) struct mmc_queue *mq = container_of(work, struct mmc_queue, recovery_work); struct request_queue *q = mq->queue; + struct mmc_host *host = mq->card->host; mmc_get_card(mq->card, &mq->ctx); mq->in_recovery = true; - if (mq->use_cqe) + if (mq->use_cqe && !host->hsq_enabled) mmc_blk_cqe_recovery(mq); else mmc_blk_mq_recovery(mq); @@ -160,6 +163,9 @@ static void mmc_mq_recovery_handler(struct work_struct *work) mq->recovery_needed = false; spin_unlock_irq(&mq->lock); + if (host->hsq_enabled) + host->cqe_ops->cqe_recovery_finish(host); + mmc_put_card(mq->card, &mq->ctx); blk_mq_run_hw_queues(q, true); @@ -279,6 +285,14 @@ static blk_status_t mmc_mq_queue_rq(struct blk_mq_hw_ctx *hctx, } break; case MMC_ISSUE_ASYNC: + /* + * For MMC host software queue, we only allow 2 requests in + * flight to avoid a long latency. + */ + if (host->hsq_enabled && mq->in_flight[issue_type] > 2) { + spin_unlock_irq(&mq->lock); + return BLK_STS_RESOURCE; + } break; default: /* @@ -430,7 +444,7 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card) * The queue depth for CQE must match the hardware because the request * tag is used to index the hardware queue. */ - if (mq->use_cqe) + if (mq->use_cqe && !host->hsq_enabled) mq->tag_set.queue_depth = min_t(int, card->ext_csd.cmdq_depth, host->cqe_qdepth); else diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index fe914ff5f5d6..76c7add367d5 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -1082,6 +1082,16 @@ retry: } } + if (host->cqe_ops && !host->cqe_enabled) { + err = host->cqe_ops->cqe_enable(host, card); + if (!err) { + host->cqe_enabled = true; + host->hsq_enabled = true; + pr_info("%s: Host Software Queue enabled\n", + mmc_hostname(host)); + } + } + if (host->caps2 & MMC_CAP2_AVOID_3_3V && host->ios.signal_voltage == MMC_SIGNAL_VOLTAGE_330) { pr_err("%s: Host failed to negotiate down from 3.3V\n", diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index 49ea02c467bf..90f1efc02eba 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -632,6 +632,7 @@ config MMC_SDHCI_SPRD depends on ARCH_SPRD depends on MMC_SDHCI_PLTFM select MMC_SDHCI_IO_ACCESSORS + select MMC_HSQ help This selects the SDIO Host Controller in Spreadtrum SoCs, this driver supports R11(IP version: R11P0). @@ -936,6 +937,17 @@ config MMC_CQHCI If unsure, say N. +config MMC_HSQ + tristate "MMC Host Software Queue support" + help + This selects the MMC Host Software Queue support. This may increase + performance, if the host controller and its driver supports it. + + If you have a controller/driver supporting this interface, say Y or M + here. + + If unsure, say N. + config MMC_TOSHIBA_PCI tristate "Toshiba Type A SD/MMC Card Interface Driver" depends on PCI diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile index 11c4598e91d9..c14b439da34b 100644 --- a/drivers/mmc/host/Makefile +++ b/drivers/mmc/host/Makefile @@ -98,6 +98,7 @@ obj-$(CONFIG_MMC_SDHCI_BRCMSTB) += sdhci-brcmstb.o obj-$(CONFIG_MMC_SDHCI_OMAP) += sdhci-omap.o obj-$(CONFIG_MMC_SDHCI_SPRD) += sdhci-sprd.o obj-$(CONFIG_MMC_CQHCI) += cqhci.o +obj-$(CONFIG_MMC_HSQ) += mmc_hsq.o ifeq ($(CONFIG_CB710_DEBUG),y) CFLAGS-cb710-mmc += -DDEBUG diff --git a/drivers/mmc/host/cqhci.c b/drivers/mmc/host/cqhci.c index 5047f7343ffc..e2ea2c4b6b94 100644 --- a/drivers/mmc/host/cqhci.c +++ b/drivers/mmc/host/cqhci.c @@ -321,14 +321,20 @@ static int cqhci_enable(struct mmc_host *mmc, struct mmc_card *card) struct cqhci_host *cq_host = mmc->cqe_private; int err; + if (!card->ext_csd.cmdq_en) + return -EINVAL; + if (cq_host->enabled) return 0; cq_host->rca = card->rca; err = cqhci_host_alloc_tdl(cq_host); - if (err) + if (err) { + pr_err("%s: Failed to enable CQE, error %d\n", + mmc_hostname(mmc), err); return err; + } __cqhci_enable(cq_host); diff --git a/drivers/mmc/host/mmc_hsq.c b/drivers/mmc/host/mmc_hsq.c new file mode 100644 index 000000000000..b90b2c97b6cf --- /dev/null +++ b/drivers/mmc/host/mmc_hsq.c @@ -0,0 +1,348 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * + * MMC software queue support based on command queue interfaces + * + * Copyright (C) 2019 Linaro, Inc. + * Author: Baolin Wang + */ + +#include +#include +#include + +#include "mmc_hsq.h" + +#define HSQ_NUM_SLOTS 64 +#define HSQ_INVALID_TAG HSQ_NUM_SLOTS + +static void mmc_hsq_pump_requests(struct mmc_hsq *hsq) +{ + struct mmc_host *mmc = hsq->mmc; + struct hsq_slot *slot; + unsigned long flags; + + spin_lock_irqsave(&hsq->lock, flags); + + /* Make sure we are not already running a request now */ + if (hsq->mrq) { + spin_unlock_irqrestore(&hsq->lock, flags); + return; + } + + /* Make sure there are remain requests need to pump */ + if (!hsq->qcnt || !hsq->enabled) { + spin_unlock_irqrestore(&hsq->lock, flags); + return; + } + + slot = &hsq->slot[hsq->next_tag]; + hsq->mrq = slot->mrq; + hsq->qcnt--; + + spin_unlock_irqrestore(&hsq->lock, flags); + + mmc->ops->request(mmc, hsq->mrq); +} + +static void mmc_hsq_update_next_tag(struct mmc_hsq *hsq, int remains) +{ + struct hsq_slot *slot; + int tag; + + /* + * If there are no remain requests in software queue, then set a invalid + * tag. + */ + if (!remains) { + hsq->next_tag = HSQ_INVALID_TAG; + return; + } + + /* + * Increasing the next tag and check if the corresponding request is + * available, if yes, then we found a candidate request. + */ + if (++hsq->next_tag != HSQ_INVALID_TAG) { + slot = &hsq->slot[hsq->next_tag]; + if (slot->mrq) + return; + } + + /* Othersie we should iterate all slots to find a available tag. */ + for (tag = 0; tag < HSQ_NUM_SLOTS; tag++) { + slot = &hsq->slot[tag]; + if (slot->mrq) + break; + } + + if (tag == HSQ_NUM_SLOTS) + tag = HSQ_INVALID_TAG; + + hsq->next_tag = tag; +} + +static void mmc_hsq_post_request(struct mmc_hsq *hsq) +{ + unsigned long flags; + int remains; + + spin_lock_irqsave(&hsq->lock, flags); + + remains = hsq->qcnt; + hsq->mrq = NULL; + + /* Update the next available tag to be queued. */ + mmc_hsq_update_next_tag(hsq, remains); + + if (hsq->waiting_for_idle && !remains) { + hsq->waiting_for_idle = false; + wake_up(&hsq->wait_queue); + } + + /* Do not pump new request in recovery mode. */ + if (hsq->recovery_halt) { + spin_unlock_irqrestore(&hsq->lock, flags); + return; + } + + spin_unlock_irqrestore(&hsq->lock, flags); + + /* + * Try to pump new request to host controller as fast as possible, + * after completing previous request. + */ + if (remains > 0) + mmc_hsq_pump_requests(hsq); +} + +/** + * mmc_hsq_finalize_request - finalize one request if the request is done + * @mmc: the host controller + * @mrq: the request need to be finalized + * + * Return true if we finalized the corresponding request in software queue, + * otherwise return false. + */ +bool mmc_hsq_finalize_request(struct mmc_host *mmc, struct mmc_request *mrq) +{ + struct mmc_hsq *hsq = mmc->cqe_private; + unsigned long flags; + + spin_lock_irqsave(&hsq->lock, flags); + + if (!hsq->enabled || !hsq->mrq || hsq->mrq != mrq) { + spin_unlock_irqrestore(&hsq->lock, flags); + return false; + } + + /* + * Clear current completed slot request to make a room for new request. + */ + hsq->slot[hsq->next_tag].mrq = NULL; + + spin_unlock_irqrestore(&hsq->lock, flags); + + mmc_cqe_request_done(mmc, hsq->mrq); + + mmc_hsq_post_request(hsq); + + return true; +} +EXPORT_SYMBOL_GPL(mmc_hsq_finalize_request); + +static void mmc_hsq_recovery_start(struct mmc_host *mmc) +{ + struct mmc_hsq *hsq = mmc->cqe_private; + unsigned long flags; + + spin_lock_irqsave(&hsq->lock, flags); + + hsq->recovery_halt = true; + + spin_unlock_irqrestore(&hsq->lock, flags); +} + +static void mmc_hsq_recovery_finish(struct mmc_host *mmc) +{ + struct mmc_hsq *hsq = mmc->cqe_private; + int remains; + + spin_lock_irq(&hsq->lock); + + hsq->recovery_halt = false; + remains = hsq->qcnt; + + spin_unlock_irq(&hsq->lock); + + /* + * Try to pump new request if there are request pending in software + * queue after finishing recovery. + */ + if (remains > 0) + mmc_hsq_pump_requests(hsq); +} + +static int mmc_hsq_request(struct mmc_host *mmc, struct mmc_request *mrq) +{ + struct mmc_hsq *hsq = mmc->cqe_private; + int tag = mrq->tag; + + spin_lock_irq(&hsq->lock); + + if (!hsq->enabled) { + spin_unlock_irq(&hsq->lock); + return -ESHUTDOWN; + } + + /* Do not queue any new requests in recovery mode. */ + if (hsq->recovery_halt) { + spin_unlock_irq(&hsq->lock); + return -EBUSY; + } + + hsq->slot[tag].mrq = mrq; + + /* + * Set the next tag as current request tag if no available + * next tag. + */ + if (hsq->next_tag == HSQ_INVALID_TAG) + hsq->next_tag = tag; + + hsq->qcnt++; + + spin_unlock_irq(&hsq->lock); + + mmc_hsq_pump_requests(hsq); + + return 0; +} + +static void mmc_hsq_post_req(struct mmc_host *mmc, struct mmc_request *mrq) +{ + if (mmc->ops->post_req) + mmc->ops->post_req(mmc, mrq, 0); +} + +static bool mmc_hsq_queue_is_idle(struct mmc_hsq *hsq, int *ret) +{ + bool is_idle; + + spin_lock_irq(&hsq->lock); + + is_idle = (!hsq->mrq && !hsq->qcnt) || + hsq->recovery_halt; + + *ret = hsq->recovery_halt ? -EBUSY : 0; + hsq->waiting_for_idle = !is_idle; + + spin_unlock_irq(&hsq->lock); + + return is_idle; +} + +static int mmc_hsq_wait_for_idle(struct mmc_host *mmc) +{ + struct mmc_hsq *hsq = mmc->cqe_private; + int ret; + + wait_event(hsq->wait_queue, + mmc_hsq_queue_is_idle(hsq, &ret)); + + return ret; +} + +static void mmc_hsq_disable(struct mmc_host *mmc) +{ + struct mmc_hsq *hsq = mmc->cqe_private; + u32 timeout = 500; + int ret; + + spin_lock_irq(&hsq->lock); + + if (!hsq->enabled) { + spin_unlock_irq(&hsq->lock); + return; + } + + spin_unlock_irq(&hsq->lock); + + ret = wait_event_timeout(hsq->wait_queue, + mmc_hsq_queue_is_idle(hsq, &ret), + msecs_to_jiffies(timeout)); + if (ret == 0) { + pr_warn("could not stop mmc software queue\n"); + return; + } + + spin_lock_irq(&hsq->lock); + + hsq->enabled = false; + + spin_unlock_irq(&hsq->lock); +} + +static int mmc_hsq_enable(struct mmc_host *mmc, struct mmc_card *card) +{ + struct mmc_hsq *hsq = mmc->cqe_private; + + spin_lock_irq(&hsq->lock); + + if (hsq->enabled) { + spin_unlock_irq(&hsq->lock); + return -EBUSY; + } + + hsq->enabled = true; + + spin_unlock_irq(&hsq->lock); + + return 0; +} + +static const struct mmc_cqe_ops mmc_hsq_ops = { + .cqe_enable = mmc_hsq_enable, + .cqe_disable = mmc_hsq_disable, + .cqe_request = mmc_hsq_request, + .cqe_post_req = mmc_hsq_post_req, + .cqe_wait_for_idle = mmc_hsq_wait_for_idle, + .cqe_recovery_start = mmc_hsq_recovery_start, + .cqe_recovery_finish = mmc_hsq_recovery_finish, +}; + +int mmc_hsq_init(struct mmc_hsq *hsq, struct mmc_host *mmc) +{ + hsq->num_slots = HSQ_NUM_SLOTS; + hsq->next_tag = HSQ_INVALID_TAG; + + hsq->slot = devm_kcalloc(mmc_dev(mmc), hsq->num_slots, + sizeof(struct hsq_slot), GFP_KERNEL); + if (!hsq->slot) + return -ENOMEM; + + hsq->mmc = mmc; + hsq->mmc->cqe_private = hsq; + mmc->cqe_ops = &mmc_hsq_ops; + + spin_lock_init(&hsq->lock); + init_waitqueue_head(&hsq->wait_queue); + + return 0; +} +EXPORT_SYMBOL_GPL(mmc_hsq_init); + +void mmc_hsq_suspend(struct mmc_host *mmc) +{ + mmc_hsq_disable(mmc); +} +EXPORT_SYMBOL_GPL(mmc_hsq_suspend); + +int mmc_hsq_resume(struct mmc_host *mmc) +{ + return mmc_hsq_enable(mmc, NULL); +} +EXPORT_SYMBOL_GPL(mmc_hsq_resume); + +MODULE_DESCRIPTION("MMC Host Software Queue support"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/mmc/host/mmc_hsq.h b/drivers/mmc/host/mmc_hsq.h new file mode 100644 index 000000000000..18b9cf55925f --- /dev/null +++ b/drivers/mmc/host/mmc_hsq.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef LINUX_MMC_HSQ_H +#define LINUX_MMC_HSQ_H + +struct hsq_slot { + struct mmc_request *mrq; +}; + +struct mmc_hsq { + struct mmc_host *mmc; + struct mmc_request *mrq; + wait_queue_head_t wait_queue; + struct hsq_slot *slot; + spinlock_t lock; + + int next_tag; + int num_slots; + int qcnt; + + bool enabled; + bool waiting_for_idle; + bool recovery_halt; +}; + +int mmc_hsq_init(struct mmc_hsq *hsq, struct mmc_host *mmc); +void mmc_hsq_suspend(struct mmc_host *mmc); +int mmc_hsq_resume(struct mmc_host *mmc); +bool mmc_hsq_finalize_request(struct mmc_host *mmc, struct mmc_request *mrq); + +#endif diff --git a/drivers/mmc/host/sdhci-sprd.c b/drivers/mmc/host/sdhci-sprd.c index d07b9793380f..2ab42c59e4f8 100644 --- a/drivers/mmc/host/sdhci-sprd.c +++ b/drivers/mmc/host/sdhci-sprd.c @@ -19,6 +19,7 @@ #include #include "sdhci-pltfm.h" +#include "mmc_hsq.h" /* SDHCI_ARGUMENT2 register high 16bit */ #define SDHCI_SPRD_ARG2_STUFF GENMASK(31, 16) @@ -379,6 +380,16 @@ static unsigned int sdhci_sprd_get_ro(struct sdhci_host *host) return 0; } +static void sdhci_sprd_request_done(struct sdhci_host *host, + struct mmc_request *mrq) +{ + /* Validate if the request was from software queue firstly. */ + if (mmc_hsq_finalize_request(host->mmc, mrq)) + return; + + mmc_request_done(host->mmc, mrq); +} + static struct sdhci_ops sdhci_sprd_ops = { .read_l = sdhci_sprd_readl, .write_l = sdhci_sprd_writel, @@ -392,6 +403,7 @@ static struct sdhci_ops sdhci_sprd_ops = { .hw_reset = sdhci_sprd_hw_reset, .get_max_timeout_count = sdhci_sprd_get_max_timeout_count, .get_ro = sdhci_sprd_get_ro, + .request_done = sdhci_sprd_request_done, }; static void sdhci_sprd_request(struct mmc_host *mmc, struct mmc_request *mrq) @@ -521,6 +533,7 @@ static int sdhci_sprd_probe(struct platform_device *pdev) { struct sdhci_host *host; struct sdhci_sprd_host *sprd_host; + struct mmc_hsq *hsq; struct clk *clk; int ret = 0; @@ -543,7 +556,7 @@ static int sdhci_sprd_probe(struct platform_device *pdev) sdhci_sprd_voltage_switch; host->mmc->caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED | - MMC_CAP_ERASE | MMC_CAP_CMD23; + MMC_CAP_ERASE | MMC_CAP_CMD23 | MMC_CAP_WAIT_WHILE_BUSY; ret = mmc_of_parse(host->mmc); if (ret) goto pltfm_free; @@ -631,6 +644,18 @@ static int sdhci_sprd_probe(struct platform_device *pdev) sprd_host->flags = host->flags; + hsq = devm_kzalloc(&pdev->dev, sizeof(*hsq), GFP_KERNEL); + if (!hsq) { + ret = -ENOMEM; + goto err_cleanup_host; + } + + ret = mmc_hsq_init(hsq, host->mmc); + if (ret) + goto err_cleanup_host; + + host->always_defer_done = true; + ret = __sdhci_add_host(host); if (ret) goto err_cleanup_host; @@ -689,6 +714,7 @@ static int sdhci_sprd_runtime_suspend(struct device *dev) struct sdhci_host *host = dev_get_drvdata(dev); struct sdhci_sprd_host *sprd_host = TO_SPRD_HOST(host); + mmc_hsq_suspend(host->mmc); sdhci_runtime_suspend_host(host); clk_disable_unprepare(sprd_host->clk_sdio); @@ -717,6 +743,8 @@ static int sdhci_sprd_runtime_resume(struct device *dev) goto clk_disable; sdhci_runtime_resume_host(host, 1); + mmc_hsq_resume(host->mmc); + return 0; clk_disable: diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 4478b94d4791..c658b302dc2e 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -2727,7 +2727,10 @@ static bool sdhci_request_done(struct sdhci_host *host) spin_unlock_irqrestore(&host->lock, flags); - mmc_request_done(host->mmc, mrq); + if (host->ops->request_done) + host->ops->request_done(host, mrq); + else + mmc_request_done(host->mmc, mrq); return false; } @@ -3030,7 +3033,7 @@ static inline bool sdhci_defer_done(struct sdhci_host *host, { struct mmc_data *data = mrq->data; - return host->pending_reset || + return host->pending_reset || host->always_defer_done || ((host->flags & SDHCI_REQ_USE_DMA) && data && data->host_cookie == COOKIE_MAPPED); } @@ -3155,7 +3158,12 @@ out: /* Process mrqs ready for immediate completion */ for (i = 0; i < SDHCI_MAX_MRQS; i++) { - if (mrqs_done[i]) + if (!mrqs_done[i]) + continue; + + if (host->ops->request_done) + host->ops->request_done(host, mrqs_done[i]); + else mmc_request_done(host->mmc, mrqs_done[i]); } diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index fe83ece6965b..d176b475fd49 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -535,6 +535,7 @@ struct sdhci_host { bool pending_reset; /* Cmd/data reset is pending */ bool irq_wake_enabled; /* IRQ wakeup is enabled */ bool v4_mode; /* Host Version 4 Enable */ + bool always_defer_done; /* Always defer to complete requests */ struct mmc_request *mrqs_done[SDHCI_MAX_MRQS]; /* Requests done */ struct mmc_command *cmd; /* Current command */ @@ -646,6 +647,8 @@ struct sdhci_ops { void (*voltage_switch)(struct sdhci_host *host); void (*adma_write_desc)(struct sdhci_host *host, void **desc, dma_addr_t addr, int len, unsigned int cmd); + void (*request_done)(struct sdhci_host *host, + struct mmc_request *mrq); }; #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.h b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.h index a3efa29a4629..63116be6b1d6 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.h @@ -38,8 +38,8 @@ enum { enum { MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_START = 0, - MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_SEARCHING = 1, - MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_TRACKING = 2, + MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_TRACKING = 1, + MLX5E_TLS_PROGRESS_PARAMS_RECORD_TRACKER_STATE_SEARCHING = 2, }; struct mlx5e_ktls_offload_context_tx { diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c index f260dd96873b..52a56622034a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c @@ -218,7 +218,7 @@ tx_sync_info_get(struct mlx5e_ktls_offload_context_tx *priv_tx, * this packet was already acknowledged and its record info * was released. */ - ends_before = before(tcp_seq + datalen, tls_record_start_seq(record)); + ends_before = before(tcp_seq + datalen - 1, tls_record_start_seq(record)); if (unlikely(tls_record_is_start_marker(record))) { ret = ends_before ? MLX5E_KTLS_SYNC_SKIP_NO_DATA : MLX5E_KTLS_SYNC_FAIL; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c index a935993a3c51..d43247a95ce5 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c @@ -1934,6 +1934,8 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) if (brcmf_sdio_hdparse(bus, bus->rxhdr, &rd_new, BRCMF_SDIO_FT_NORMAL)) { rd->len = 0; + brcmf_sdio_rxfail(bus, true, true); + sdio_release_host(bus->sdiodev->func1); brcmu_pkt_buf_free_skb(pkt); continue; } diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c index 386ca67ec7b4..cb5465d9c068 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c @@ -8,7 +8,7 @@ * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH * Copyright(c) 2015 - 2017 Intel Deutschland GmbH - * Copyright(c) 2018 - 2019 Intel Corporation + * Copyright(c) 2018 - 2020 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) 2005 - 2014 Intel Corporation. All rights reserved. * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH * Copyright(c) 2015 - 2017 Intel Deutschland GmbH - * Copyright(c) 2018 - 2019 Intel Corporation + * Copyright(c) 2018 - 2020 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -1373,11 +1373,7 @@ static int iwl_dump_ini_rxf_iter(struct iwl_fw_runtime *fwrt, goto out; } - /* - * region register have absolute value so apply rxf offset after - * reading the registers - */ - offs += rxf_data.offset; + offs = rxf_data.offset; /* Lock fence */ iwl_write_prph_no_grab(fwrt->trans, RXF_SET_FENCE_MODE + offs, 0x1); @@ -2315,10 +2311,7 @@ static void iwl_fw_dbg_collect_sync(struct iwl_fw_runtime *fwrt, u8 wk_idx) goto out; } - if (iwl_fw_dbg_stop_restart_recording(fwrt, ¶ms, true)) { - IWL_ERR(fwrt, "Failed to stop DBGC recording, aborting dump\n"); - goto out; - } + iwl_fw_dbg_stop_restart_recording(fwrt, ¶ms, true); IWL_DEBUG_FW_INFO(fwrt, "WRT: Data collection start\n"); if (iwl_trans_dbg_ini_valid(fwrt->trans)) @@ -2484,14 +2477,14 @@ static int iwl_fw_dbg_restart_recording(struct iwl_trans *trans, return 0; } -int iwl_fw_dbg_stop_restart_recording(struct iwl_fw_runtime *fwrt, - struct iwl_fw_dbg_params *params, - bool stop) +void iwl_fw_dbg_stop_restart_recording(struct iwl_fw_runtime *fwrt, + struct iwl_fw_dbg_params *params, + bool stop) { int ret = 0; if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) - return 0; + return; if (fw_has_capa(&fwrt->fw->ucode_capa, IWL_UCODE_TLV_CAPA_DBG_SUSPEND_RESUME_CMD_SUPP)) @@ -2508,7 +2501,5 @@ int iwl_fw_dbg_stop_restart_recording(struct iwl_fw_runtime *fwrt, iwl_fw_set_dbg_rec_on(fwrt); } #endif - - return ret; } IWL_EXPORT_SYMBOL(iwl_fw_dbg_stop_restart_recording); diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.h b/drivers/net/wireless/intel/iwlwifi/fw/dbg.h index e3b5dd34643f..2ac61629f46f 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.h +++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.h @@ -263,9 +263,9 @@ _iwl_fw_dbg_trigger_simple_stop(struct iwl_fw_runtime *fwrt, _iwl_fw_dbg_trigger_simple_stop((fwrt), (wdev), \ iwl_fw_dbg_get_trigger((fwrt)->fw,\ (trig))) -int iwl_fw_dbg_stop_restart_recording(struct iwl_fw_runtime *fwrt, - struct iwl_fw_dbg_params *params, - bool stop); +void iwl_fw_dbg_stop_restart_recording(struct iwl_fw_runtime *fwrt, + struct iwl_fw_dbg_params *params, + bool stop); #ifdef CONFIG_IWLWIFI_DEBUGFS static inline void iwl_fw_set_dbg_rec_on(struct iwl_fw_runtime *fwrt) diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c index 098d48153a38..24df3182ec9e 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c @@ -147,7 +147,11 @@ static u16 rs_fw_get_config_flags(struct iwl_mvm *mvm, (vht_ena && (vht_cap->cap & IEEE80211_VHT_CAP_RXLDPC)))) flags |= IWL_TLC_MNG_CFG_FLAGS_LDPC_MSK; - /* consider our LDPC support in case of HE */ + /* consider LDPC support in case of HE */ + if (he_cap->has_he && (he_cap->he_cap_elem.phy_cap_info[1] & + IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)) + flags |= IWL_TLC_MNG_CFG_FLAGS_LDPC_MSK; + if (sband->iftype_data && sband->iftype_data->he_cap.has_he && !(sband->iftype_data->he_cap.he_cap_elem.phy_cap_info[1] & IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)) diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c index 4ff51da3b13f..73e8475ddc8a 100644 --- a/drivers/nvme/host/rdma.c +++ b/drivers/nvme/host/rdma.c @@ -850,9 +850,11 @@ out_free_tagset: if (new) blk_mq_free_tag_set(ctrl->ctrl.admin_tagset); out_free_async_qe: - nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, - sizeof(struct nvme_command), DMA_TO_DEVICE); - ctrl->async_event_sqe.data = NULL; + if (ctrl->async_event_sqe.data) { + nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, + sizeof(struct nvme_command), DMA_TO_DEVICE); + ctrl->async_event_sqe.data = NULL; + } out_free_queue: nvme_rdma_free_queue(&ctrl->queues[0]); return error; diff --git a/drivers/nvmem/nvmem-sysfs.c b/drivers/nvmem/nvmem-sysfs.c index 9e0c429cd08a..8759c4470012 100644 --- a/drivers/nvmem/nvmem-sysfs.c +++ b/drivers/nvmem/nvmem-sysfs.c @@ -56,6 +56,9 @@ static ssize_t bin_attr_nvmem_read(struct file *filp, struct kobject *kobj, count = round_down(count, nvmem->word_size); + if (!nvmem->reg_read) + return -EPERM; + rc = nvmem->reg_read(nvmem->priv, pos, buf, count); if (rc) @@ -90,6 +93,9 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj, count = round_down(count, nvmem->word_size); + if (!nvmem->reg_write) + return -EPERM; + rc = nvmem->reg_write(nvmem->priv, pos, buf, count); if (rc) diff --git a/drivers/nvmem/sprd-efuse.c b/drivers/nvmem/sprd-efuse.c index 2f1e0fbd1901..925feb21d5ad 100644 --- a/drivers/nvmem/sprd-efuse.c +++ b/drivers/nvmem/sprd-efuse.c @@ -217,12 +217,14 @@ static int sprd_efuse_raw_prog(struct sprd_efuse *efuse, u32 blk, bool doub, * Enable the auto-check function to validate if the programming is * successful. */ - sprd_efuse_set_auto_check(efuse, true); + if (lock) + sprd_efuse_set_auto_check(efuse, true); writel(*data, efuse->base + SPRD_EFUSE_MEM(blk)); /* Disable auto-check and data double after programming */ - sprd_efuse_set_auto_check(efuse, false); + if (lock) + sprd_efuse_set_auto_check(efuse, false); sprd_efuse_set_data_double(efuse, false); /* @@ -237,9 +239,9 @@ static int sprd_efuse_raw_prog(struct sprd_efuse *efuse, u32 blk, bool doub, writel(SPRD_EFUSE_ERR_CLR_MASK, efuse->base + SPRD_EFUSE_ERR_CLR); ret = -EBUSY; - } else { + } else if (lock) { sprd_efuse_set_prog_lock(efuse, lock); - writel(*data, efuse->base + SPRD_EFUSE_MEM(blk)); + writel(0, efuse->base + SPRD_EFUSE_MEM(blk)); sprd_efuse_set_prog_lock(efuse, false); } @@ -322,6 +324,8 @@ unlock: static int sprd_efuse_write(void *context, u32 offset, void *val, size_t bytes) { struct sprd_efuse *efuse = context; + bool blk_double = efuse->data->blk_double; + bool lock; int ret; ret = sprd_efuse_lock(efuse); @@ -332,7 +336,20 @@ static int sprd_efuse_write(void *context, u32 offset, void *val, size_t bytes) if (ret) goto unlock; - ret = sprd_efuse_raw_prog(efuse, offset, false, false, val); + /* + * If the writing bytes are equal with the block width, which means the + * whole block will be programmed. For this case, we should not allow + * this block to be programmed again by locking this block. + * + * If the block was programmed partially, we should allow this block to + * be programmed again. + */ + if (bytes < SPRD_EFUSE_BLOCK_WIDTH) + lock = false; + else + lock = true; + + ret = sprd_efuse_raw_prog(efuse, offset, blk_double, lock, val); clk_disable_unprepare(efuse->clk); diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 793412954529..e401f040f157 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -464,7 +464,8 @@ static ssize_t dev_rescan_store(struct device *dev, } return count; } -static DEVICE_ATTR_WO(dev_rescan); +static struct device_attribute dev_attr_dev_rescan = __ATTR(rescan, 0200, NULL, + dev_rescan_store); static ssize_t remove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -501,7 +502,8 @@ static ssize_t bus_rescan_store(struct device *dev, } return count; } -static DEVICE_ATTR_WO(bus_rescan); +static struct device_attribute dev_attr_bus_rescan = __ATTR(rescan, 0200, NULL, + bus_rescan_store); #if defined(CONFIG_PM) && defined(CONFIG_ACPI) static ssize_t d3cold_allowed_store(struct device *dev, diff --git a/drivers/pinctrl/sprd/pinctrl-sprd.c b/drivers/pinctrl/sprd/pinctrl-sprd.c index ea04bac3b453..48cbf2a2837f 100644 --- a/drivers/pinctrl/sprd/pinctrl-sprd.c +++ b/drivers/pinctrl/sprd/pinctrl-sprd.c @@ -464,9 +464,15 @@ static int sprd_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin_id, case PIN_CONFIG_INPUT_ENABLE: arg = (reg >> SLEEP_INPUT_SHIFT) & SLEEP_INPUT_MASK; break; - case PIN_CONFIG_OUTPUT: + case PIN_CONFIG_OUTPUT_ENABLE: arg = reg & SLEEP_OUTPUT_MASK; break; + case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: + if ((reg & SLEEP_OUTPUT) || (reg & SLEEP_INPUT)) + return -EINVAL; + + arg = 1; + break; case PIN_CONFIG_DRIVE_STRENGTH: arg = (reg >> DRIVE_STRENGTH_SHIFT) & DRIVE_STRENGTH_MASK; @@ -635,13 +641,23 @@ static int sprd_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin_id, shift = SLEEP_INPUT_SHIFT; } break; - case PIN_CONFIG_OUTPUT: + case PIN_CONFIG_OUTPUT_ENABLE: if (is_sleep_config == true) { - val |= SLEEP_OUTPUT; + if (arg > 0) + val |= SLEEP_OUTPUT; + else + val &= ~SLEEP_OUTPUT; + mask = SLEEP_OUTPUT_MASK; shift = SLEEP_OUTPUT_SHIFT; } break; + case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: + if (is_sleep_config == true) { + val = shift = 0; + mask = SLEEP_OUTPUT | SLEEP_INPUT; + } + break; case PIN_CONFIG_DRIVE_STRENGTH: if (arg < 2 || arg > 60) return -EINVAL; diff --git a/drivers/power/supply/axp288_charger.c b/drivers/power/supply/axp288_charger.c index 1bbba6bba673..cf4c67b2d235 100644 --- a/drivers/power/supply/axp288_charger.c +++ b/drivers/power/supply/axp288_charger.c @@ -21,6 +21,7 @@ #include #include #include +#include #define PS_STAT_VBUS_TRIGGER BIT(0) #define PS_STAT_BAT_CHRG_DIR BIT(2) @@ -545,6 +546,49 @@ out: return IRQ_HANDLED; } +/* + * The HP Pavilion x2 10 series comes in a number of variants: + * Bay Trail SoC + AXP288 PMIC, DMI_BOARD_NAME: "815D" + * Cherry Trail SoC + AXP288 PMIC, DMI_BOARD_NAME: "813E" + * Cherry Trail SoC + TI PMIC, DMI_BOARD_NAME: "827C" or "82F4" + * + * The variants with the AXP288 PMIC are all kinds of special: + * + * 1. All variants use a Type-C connector which the AXP288 does not support, so + * when using a Type-C charger it is not recognized. Unlike most AXP288 devices, + * this model actually has mostly working ACPI AC / Battery code, the ACPI code + * "solves" this by simply setting the input_current_limit to 3A. + * There are still some issues with the ACPI code, so we use this native driver, + * and to solve the charging not working (500mA is not enough) issue we hardcode + * the 3A input_current_limit like the ACPI code does. + * + * 2. If no charger is connected the machine boots with the vbus-path disabled. + * Normally this is done when a 5V boost converter is active to avoid the PMIC + * trying to charge from the 5V boost converter's output. This is done when + * an OTG host cable is inserted and the ID pin on the micro-B receptacle is + * pulled low and the ID pin has an ACPI event handler associated with it + * which re-enables the vbus-path when the ID pin is pulled high when the + * OTG host cable is removed. The Type-C connector has no ID pin, there is + * no ID pin handler and there appears to be no 5V boost converter, so we + * end up not charging because the vbus-path is disabled, until we unplug + * the charger which automatically clears the vbus-path disable bit and then + * on the second plug-in of the adapter we start charging. To solve the not + * charging on first charger plugin we unconditionally enable the vbus-path at + * probe on this model, which is safe since there is no 5V boost converter. + */ +static const struct dmi_system_id axp288_hp_x2_dmi_ids[] = { + { + /* + * Bay Trail model has "Hewlett-Packard" as sys_vendor, Cherry + * Trail model has "HP", so we only match on product_name. + */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"), + }, + }, + {} /* Terminating entry */ +}; + static void axp288_charger_extcon_evt_worker(struct work_struct *work) { struct axp288_chrg_info *info = @@ -568,7 +612,11 @@ static void axp288_charger_extcon_evt_worker(struct work_struct *work) } /* Determine cable/charger type */ - if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0) { + if (dmi_check_system(axp288_hp_x2_dmi_ids)) { + /* See comment above axp288_hp_x2_dmi_ids declaration */ + dev_dbg(&info->pdev->dev, "HP X2 with Type-C, setting inlmt to 3A\n"); + current_limit = 3000000; + } else if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0) { dev_dbg(&info->pdev->dev, "USB SDP charger is connected\n"); current_limit = 500000; } else if (extcon_get_state(edev, EXTCON_CHG_USB_CDP) > 0) { @@ -685,6 +733,13 @@ static int charger_init_hw_regs(struct axp288_chrg_info *info) return ret; } + if (dmi_check_system(axp288_hp_x2_dmi_ids)) { + /* See comment above axp288_hp_x2_dmi_ids declaration */ + ret = axp288_charger_vbus_path_select(info, true); + if (ret < 0) + return ret; + } + /* Read current charge voltage and current limit */ ret = regmap_read(info->regmap, AXP20X_CHRG_CTRL1, &val); if (ret < 0) { diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c index f37ad4eae60b..d0d549611794 100644 --- a/drivers/power/supply/power_supply_sysfs.c +++ b/drivers/power/supply/power_supply_sysfs.c @@ -61,7 +61,7 @@ static const char * const power_supply_charge_type_text[] = { static const char * const power_supply_health_text[] = { "Unknown", "Good", "Overheat", "Dead", "Over voltage", "Unspecified failure", "Cold", "Watchdog timer expire", - "Safety timer expire", "Over current" + "Safety timer expire", "Over current", "Warm", "Cool", "Hot" }; static const char * const power_supply_technology_text[] = { diff --git a/drivers/scsi/ufs/ufshcd-crypto.c b/drivers/scsi/ufs/ufshcd-crypto.c index 6999970235b3..d62ab7a9faff 100644 --- a/drivers/scsi/ufs/ufshcd-crypto.c +++ b/drivers/scsi/ufs/ufshcd-crypto.c @@ -336,7 +336,9 @@ int ufshcd_hba_init_crypto_spec(struct ufs_hba *hba, ufshcd_clear_all_keyslots(hba); hba->ksm = keyslot_manager_create(hba->dev, ufshcd_num_keyslots(hba), - ksm_ops, crypto_modes_supported, hba); + ksm_ops, + BLK_CRYPTO_FEATURE_STANDARD_KEYS, + crypto_modes_supported, hba); if (!hba->ksm) { err = -ENOMEM; diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c index 3c82de5f9417..73a852b2f417 100644 --- a/drivers/soc/mediatek/mtk-cmdq-helper.c +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c @@ -38,6 +38,7 @@ struct cmdq_client *cmdq_mbox_create(struct device *dev, int index, u32 timeout) client->pkt_cnt = 0; client->client.dev = dev; client->client.tx_block = false; + client->client.knows_txdone = true; client->chan = mbox_request_channel(&client->client, index); if (IS_ERR(client->chan)) { diff --git a/drivers/staging/android/ion/ion_dma_buf.c b/drivers/staging/android/ion/ion_dma_buf.c index 5917ce9f8f44..5a2e17917099 100644 --- a/drivers/staging/android/ion/ion_dma_buf.c +++ b/drivers/staging/android/ion/ion_dma_buf.c @@ -45,12 +45,6 @@ static void free_duped_table(struct sg_table *table) kfree(table); } -struct ion_dma_buf_attachment { - struct device *dev; - struct sg_table *table; - struct list_head list; -}; - static int ion_dma_buf_attach(struct dma_buf *dmabuf, struct dma_buf_attachment *attachment) { @@ -293,11 +287,16 @@ static void *ion_dma_buf_vmap(struct dma_buf *dmabuf) { struct ion_buffer *buffer = dmabuf->priv; struct ion_heap *heap = buffer->heap; + void *vaddr; - if (!heap->buf_ops.vmap) - return ERR_PTR(-EOPNOTSUPP); + if (heap->buf_ops.vmap) + return heap->buf_ops.vmap(dmabuf); - return heap->buf_ops.vmap(dmabuf); + mutex_lock(&buffer->lock); + vaddr = ion_buffer_kmap_get(buffer); + mutex_unlock(&buffer->lock); + + return vaddr; } static void ion_dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr) @@ -305,10 +304,14 @@ static void ion_dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr) struct ion_buffer *buffer = dmabuf->priv; struct ion_heap *heap = buffer->heap; - if (!heap->buf_ops.vunmap) + if (heap->buf_ops.vunmap) { + heap->buf_ops.vunmap(dmabuf, vaddr); return; + } - return heap->buf_ops.vunmap(dmabuf, vaddr); + mutex_lock(&buffer->lock); + ion_buffer_kmap_put(buffer); + mutex_unlock(&buffer->lock); } static int ion_dma_buf_get_flags(struct dma_buf *dmabuf, unsigned long *flags) diff --git a/drivers/watchdog/iTCO_vendor.h b/drivers/watchdog/iTCO_vendor.h index 0f7373ba10d5..69e92e692ae0 100644 --- a/drivers/watchdog/iTCO_vendor.h +++ b/drivers/watchdog/iTCO_vendor.h @@ -1,10 +1,12 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* iTCO Vendor Specific Support hooks */ #ifdef CONFIG_ITCO_VENDOR_SUPPORT +extern int iTCO_vendorsupport; extern void iTCO_vendor_pre_start(struct resource *, unsigned int); extern void iTCO_vendor_pre_stop(struct resource *); extern int iTCO_vendor_check_noreboot_on(void); #else +#define iTCO_vendorsupport 0 #define iTCO_vendor_pre_start(acpibase, heartbeat) {} #define iTCO_vendor_pre_stop(acpibase) {} #define iTCO_vendor_check_noreboot_on() 1 diff --git a/drivers/watchdog/iTCO_vendor_support.c b/drivers/watchdog/iTCO_vendor_support.c index 4f1b96f59349..cf0eaa04b064 100644 --- a/drivers/watchdog/iTCO_vendor_support.c +++ b/drivers/watchdog/iTCO_vendor_support.c @@ -39,8 +39,10 @@ /* Broken BIOS */ #define BROKEN_BIOS 911 -static int vendorsupport; -module_param(vendorsupport, int, 0); +int iTCO_vendorsupport; +EXPORT_SYMBOL(iTCO_vendorsupport); + +module_param_named(vendorsupport, iTCO_vendorsupport, int, 0); MODULE_PARM_DESC(vendorsupport, "iTCO vendor specific support mode, default=" "0 (none), 1=SuperMicro Pent3, 911=Broken SMI BIOS"); @@ -152,7 +154,7 @@ static void broken_bios_stop(struct resource *smires) void iTCO_vendor_pre_start(struct resource *smires, unsigned int heartbeat) { - switch (vendorsupport) { + switch (iTCO_vendorsupport) { case SUPERMICRO_OLD_BOARD: supermicro_old_pre_start(smires); break; @@ -165,7 +167,7 @@ EXPORT_SYMBOL(iTCO_vendor_pre_start); void iTCO_vendor_pre_stop(struct resource *smires) { - switch (vendorsupport) { + switch (iTCO_vendorsupport) { case SUPERMICRO_OLD_BOARD: supermicro_old_pre_stop(smires); break; @@ -178,7 +180,7 @@ EXPORT_SYMBOL(iTCO_vendor_pre_stop); int iTCO_vendor_check_noreboot_on(void) { - switch (vendorsupport) { + switch (iTCO_vendorsupport) { case SUPERMICRO_OLD_BOARD: return 0; default: @@ -189,13 +191,13 @@ EXPORT_SYMBOL(iTCO_vendor_check_noreboot_on); static int __init iTCO_vendor_init_module(void) { - if (vendorsupport == SUPERMICRO_NEW_BOARD) { + if (iTCO_vendorsupport == SUPERMICRO_NEW_BOARD) { pr_warn("Option vendorsupport=%d is no longer supported, " "please use the w83627hf_wdt driver instead\n", SUPERMICRO_NEW_BOARD); return -EINVAL; } - pr_info("vendor-support=%d\n", vendorsupport); + pr_info("vendor-support=%d\n", iTCO_vendorsupport); return 0; } diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c index 156360e37714..e707c4797f76 100644 --- a/drivers/watchdog/iTCO_wdt.c +++ b/drivers/watchdog/iTCO_wdt.c @@ -459,13 +459,25 @@ static int iTCO_wdt_probe(struct platform_device *pdev) if (!p->tco_res) return -ENODEV; - p->smi_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_SMI); - if (!p->smi_res) - return -ENODEV; - p->iTCO_version = pdata->version; p->pci_dev = to_pci_dev(dev->parent); + p->smi_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_SMI); + if (p->smi_res) { + /* The TCO logic uses the TCO_EN bit in the SMI_EN register */ + if (!devm_request_region(dev, p->smi_res->start, + resource_size(p->smi_res), + pdev->name)) { + pr_err("I/O address 0x%04llx already in use, device disabled\n", + (u64)SMI_EN(p)); + return -EBUSY; + } + } else if (iTCO_vendorsupport || + turn_SMI_watchdog_clear_off >= p->iTCO_version) { + pr_err("SMI I/O resource is missing\n"); + return -ENODEV; + } + iTCO_wdt_no_reboot_bit_setup(p, pdata); /* @@ -492,14 +504,6 @@ static int iTCO_wdt_probe(struct platform_device *pdev) /* Set the NO_REBOOT bit to prevent later reboots, just for sure */ p->update_no_reboot_bit(p->no_reboot_priv, true); - /* The TCO logic uses the TCO_EN bit in the SMI_EN register */ - if (!devm_request_region(dev, p->smi_res->start, - resource_size(p->smi_res), - pdev->name)) { - pr_err("I/O address 0x%04llx already in use, device disabled\n", - (u64)SMI_EN(p)); - return -EBUSY; - } if (turn_SMI_watchdog_clear_off >= p->iTCO_version) { /* * Bit 13: TCO_EN -> 0 diff --git a/fs/crypto/fscrypt_private.h b/fs/crypto/fscrypt_private.h index e3cff3c6988f..fed1a2148834 100644 --- a/fs/crypto/fscrypt_private.h +++ b/fs/crypto/fscrypt_private.h @@ -326,7 +326,8 @@ extern void fscrypt_destroy_hkdf(struct fscrypt_hkdf *hkdf); /* inline_crypt.c */ #ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT -extern void fscrypt_select_encryption_impl(struct fscrypt_info *ci); +extern int fscrypt_select_encryption_impl(struct fscrypt_info *ci, + bool is_hw_wrapped_key); static inline bool fscrypt_using_inline_encryption(const struct fscrypt_info *ci) @@ -370,8 +371,10 @@ fscrypt_is_key_prepared(struct fscrypt_prepared_key *prep_key, #else /* CONFIG_FS_ENCRYPTION_INLINE_CRYPT */ -static inline void fscrypt_select_encryption_impl(struct fscrypt_info *ci) +static inline int fscrypt_select_encryption_impl(struct fscrypt_info *ci, + bool is_hw_wrapped_key) { + return 0; } static inline bool fscrypt_using_inline_encryption( diff --git a/fs/crypto/inline_crypt.c b/fs/crypto/inline_crypt.c index 00da0effa6c9..eaa2014ec84b 100644 --- a/fs/crypto/inline_crypt.c +++ b/fs/crypto/inline_crypt.c @@ -25,26 +25,76 @@ struct fscrypt_blk_crypto_key { struct request_queue *devs[]; }; +static int fscrypt_get_num_devices(struct super_block *sb) +{ + if (sb->s_cop->get_num_devices) + return sb->s_cop->get_num_devices(sb); + return 1; +} + +static void fscrypt_get_devices(struct super_block *sb, int num_devs, + struct request_queue **devs) +{ + if (num_devs == 1) + devs[0] = bdev_get_queue(sb->s_bdev); + else + sb->s_cop->get_devices(sb, devs); +} + /* Enable inline encryption for this file if supported. */ -void fscrypt_select_encryption_impl(struct fscrypt_info *ci) +int fscrypt_select_encryption_impl(struct fscrypt_info *ci, + bool is_hw_wrapped_key) { const struct inode *inode = ci->ci_inode; struct super_block *sb = inode->i_sb; + enum blk_crypto_mode_num crypto_mode = ci->ci_mode->blk_crypto_mode; + struct request_queue **devs; + int num_devs; + int i; /* The file must need contents encryption, not filenames encryption */ if (!S_ISREG(inode->i_mode)) - return; + return 0; /* blk-crypto must implement the needed encryption algorithm */ - if (ci->ci_mode->blk_crypto_mode == BLK_ENCRYPTION_MODE_INVALID) - return; + if (crypto_mode == BLK_ENCRYPTION_MODE_INVALID) + return 0; /* The filesystem must be mounted with -o inlinecrypt */ if (!sb->s_cop->inline_crypt_enabled || !sb->s_cop->inline_crypt_enabled(sb)) - return; + return 0; + + /* + * The needed encryption settings must be supported either by + * blk-crypto-fallback, or by hardware on all the filesystem's devices. + */ + + if (IS_ENABLED(CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK) && + !is_hw_wrapped_key) { + ci->ci_inlinecrypt = true; + return 0; + } + + num_devs = fscrypt_get_num_devices(sb); + devs = kmalloc_array(num_devs, sizeof(*devs), GFP_NOFS); + if (!devs) + return -ENOMEM; + + fscrypt_get_devices(sb, num_devs, devs); + + for (i = 0; i < num_devs; i++) { + if (!keyslot_manager_crypto_mode_supported(devs[i]->ksm, + crypto_mode, + sb->s_blocksize, + is_hw_wrapped_key)) + goto out_free_devs; + } ci->ci_inlinecrypt = true; +out_free_devs: + kfree(devs); + return 0; } int fscrypt_prepare_inline_crypt_key(struct fscrypt_prepared_key *prep_key, @@ -56,14 +106,13 @@ int fscrypt_prepare_inline_crypt_key(struct fscrypt_prepared_key *prep_key, const struct inode *inode = ci->ci_inode; struct super_block *sb = inode->i_sb; enum blk_crypto_mode_num crypto_mode = ci->ci_mode->blk_crypto_mode; - int num_devs = 1; + int num_devs; int queue_refs = 0; struct fscrypt_blk_crypto_key *blk_key; int err; int i; - if (sb->s_cop->get_num_devices) - num_devs = sb->s_cop->get_num_devices(sb); + num_devs = fscrypt_get_num_devices(sb); if (WARN_ON(num_devs < 1)) return -EINVAL; @@ -72,10 +121,7 @@ int fscrypt_prepare_inline_crypt_key(struct fscrypt_prepared_key *prep_key, return -ENOMEM; blk_key->num_devs = num_devs; - if (num_devs == 1) - blk_key->devs[0] = bdev_get_queue(sb->s_bdev); - else - sb->s_cop->get_devices(sb, blk_key->devs); + fscrypt_get_devices(sb, num_devs, blk_key->devs); BUILD_BUG_ON(FSCRYPT_MAX_HW_WRAPPED_KEY_SIZE > BLK_CRYPTO_MAX_WRAPPED_KEY_SIZE); @@ -103,6 +149,7 @@ int fscrypt_prepare_inline_crypt_key(struct fscrypt_prepared_key *prep_key, queue_refs++; err = blk_crypto_start_using_mode(crypto_mode, sb->s_blocksize, + is_hw_wrapped, blk_key->devs[i]); if (err) { fscrypt_err(inode, diff --git a/fs/crypto/keysetup.c b/fs/crypto/keysetup.c index 34f95cd6c8eb..09f5d5d2904c 100644 --- a/fs/crypto/keysetup.c +++ b/fs/crypto/keysetup.c @@ -328,8 +328,6 @@ static int setup_file_encryption_key(struct fscrypt_info *ci, struct fscrypt_key_specifier mk_spec; int err; - fscrypt_select_encryption_impl(ci); - switch (ci->ci_policy.version) { case FSCRYPT_POLICY_V1: mk_spec.type = FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR; @@ -354,6 +352,10 @@ static int setup_file_encryption_key(struct fscrypt_info *ci, ci->ci_policy.version != FSCRYPT_POLICY_V1) return PTR_ERR(key); + err = fscrypt_select_encryption_impl(ci, false); + if (err) + return err; + /* * As a legacy fallback for v1 policies, search for the key in * the current task's subscribed keyrings too. Don't move this @@ -388,6 +390,10 @@ static int setup_file_encryption_key(struct fscrypt_info *ci, goto out_release_key; } + err = fscrypt_select_encryption_impl(ci, mk->mk_secret.is_hw_wrapped); + if (err) + goto out_release_key; + switch (ci->ci_policy.version) { case FSCRYPT_POLICY_V1: err = fscrypt_setup_v1_file_key(ci, mk->mk_secret.raw); diff --git a/fs/incfs/data_mgmt.c b/fs/incfs/data_mgmt.c index 6661ac3b52da..91541b46f771 100644 --- a/fs/incfs/data_mgmt.c +++ b/fs/incfs/data_mgmt.c @@ -27,28 +27,19 @@ struct mount_info *incfs_alloc_mount_info(struct super_block *sb, return ERR_PTR(-ENOMEM); mi->mi_sb = sb; - mi->mi_options = *options; mi->mi_backing_dir_path = *backing_dir_path; mi->mi_owner = get_current_cred(); path_get(&mi->mi_backing_dir_path); mutex_init(&mi->mi_dir_struct_mutex); mutex_init(&mi->mi_pending_reads_mutex); init_waitqueue_head(&mi->mi_pending_reads_notif_wq); + init_waitqueue_head(&mi->mi_log.ml_notif_wq); + spin_lock_init(&mi->mi_log.rl_writer_lock); INIT_LIST_HEAD(&mi->mi_reads_list_head); - if (options->read_log_pages != 0) { - size_t buf_size = PAGE_SIZE * options->read_log_pages; - - spin_lock_init(&mi->mi_log.rl_writer_lock); - init_waitqueue_head(&mi->mi_log.ml_notif_wq); - - mi->mi_log.rl_size = buf_size / sizeof(*mi->mi_log.rl_ring_buf); - mi->mi_log.rl_ring_buf = kzalloc(buf_size, GFP_NOFS); - if (!mi->mi_log.rl_ring_buf) { - error = -ENOMEM; - goto err; - } - } + error = incfs_realloc_mount_info(mi, options); + if (error) + goto err; return mi; @@ -57,6 +48,26 @@ err: return ERR_PTR(error); } +int incfs_realloc_mount_info(struct mount_info *mi, + struct mount_options *options) +{ + kfree(mi->mi_log.rl_ring_buf); + mi->mi_log.rl_ring_buf = NULL; + mi->mi_log.rl_size = 0; + + mi->mi_options = *options; + if (options->read_log_pages != 0) { + size_t buf_size = PAGE_SIZE * options->read_log_pages; + + mi->mi_log.rl_size = buf_size / sizeof(*mi->mi_log.rl_ring_buf); + mi->mi_log.rl_ring_buf = kzalloc(buf_size, GFP_NOFS); + if (!mi->mi_log.rl_ring_buf) + return -ENOMEM; + } + + return 0; +} + void incfs_free_mount_info(struct mount_info *mi) { if (!mi) @@ -371,11 +382,19 @@ static int get_data_file_block(struct data_file *df, int index, return 0; } +static int check_room_for_one_range(u32 size, u32 size_out) +{ + if (size_out + sizeof(struct incfs_filled_range) > size) + return -ERANGE; + return 0; +} + static int copy_one_range(struct incfs_filled_range *range, void __user *buffer, u32 size, u32 *size_out) { - if (*size_out + sizeof(*range) > size) - return -ERANGE; + int error = check_room_for_one_range(size, *size_out); + if (error) + return error; if (copy_to_user(((char *)buffer) + *size_out, range, sizeof(*range))) return -EFAULT; @@ -384,6 +403,34 @@ static int copy_one_range(struct incfs_filled_range *range, void __user *buffer, return 0; } +static int update_file_header_flags(struct data_file *df, u32 bits_to_reset, + u32 bits_to_set) +{ + int result; + u32 new_flags; + struct backing_file_context *bfc; + + if (!df) + return -EFAULT; + bfc = df->df_backing_file_context; + if (!bfc) + return -EFAULT; + + result = mutex_lock_interruptible(&bfc->bc_mutex); + if (result) + return result; + + new_flags = (df->df_header_flags & ~bits_to_reset) | bits_to_set; + if (new_flags != df->df_header_flags) { + df->df_header_flags = new_flags; + result = incfs_write_file_header_flags(bfc, new_flags); + } + + mutex_unlock(&bfc->bc_mutex); + + return result; +} + int incfs_get_filled_blocks(struct data_file *df, struct incfs_get_filled_blocks_args *arg) { @@ -400,6 +447,7 @@ int incfs_get_filled_blocks(struct data_file *df, if (end_index > df->df_total_block_count) end_index = df->df_total_block_count; arg->total_blocks_out = df->df_total_block_count; + arg->data_blocks_out = df->df_data_block_count; if (df->df_header_flags & INCFS_FILE_COMPLETE) { pr_debug("File marked full, fast get_filled_blocks"); @@ -407,14 +455,22 @@ int incfs_get_filled_blocks(struct data_file *df, arg->index_out = arg->start_index; return 0; } + arg->index_out = arg->start_index; + + error = check_room_for_one_range(size, *size_out); + if (error) + return error; range = (struct incfs_filled_range){ .begin = arg->start_index, .end = end_index, }; + error = copy_one_range(&range, buffer, size, size_out); + if (error) + return error; arg->index_out = end_index; - return copy_one_range(&range, buffer, size, size_out); + return 0; } for (arg->index_out = arg->start_index; arg->index_out < end_index; @@ -429,13 +485,20 @@ int incfs_get_filled_blocks(struct data_file *df, continue; if (!in_range) { + error = check_room_for_one_range(size, *size_out); + if (error) + break; in_range = true; range.begin = arg->index_out; } else { range.end = arg->index_out; error = copy_one_range(&range, buffer, size, size_out); - if (error) + if (error) { + /* there will be another try out of the loop, + * it will reset the index_out if it fails too + */ break; + } in_range = false; } } @@ -443,17 +506,15 @@ int incfs_get_filled_blocks(struct data_file *df, if (in_range) { range.end = arg->index_out; error = copy_one_range(&range, buffer, size, size_out); + if (error) + arg->index_out = range.begin; } if (!error && in_range && arg->start_index == 0 && end_index == df->df_total_block_count && *size_out == sizeof(struct incfs_filled_range)) { - int result; - - df->df_header_flags |= INCFS_FILE_COMPLETE; - result = incfs_update_file_header_flags( - df->df_backing_file_context, df->df_header_flags); - + int result = + update_file_header_flags(df, 0, INCFS_FILE_COMPLETE); /* Log failure only, since it's just a failed optimization */ pr_debug("Marked file full with result %d", result); } diff --git a/fs/incfs/data_mgmt.h b/fs/incfs/data_mgmt.h index bd9b63af920e..e8f2154c80d9 100644 --- a/fs/incfs/data_mgmt.h +++ b/fs/incfs/data_mgmt.h @@ -223,6 +223,9 @@ struct mount_info *incfs_alloc_mount_info(struct super_block *sb, struct mount_options *options, struct path *backing_dir_path); +int incfs_realloc_mount_info(struct mount_info *mi, + struct mount_options *options); + void incfs_free_mount_info(struct mount_info *mi); struct data_file *incfs_open_data_file(struct mount_info *mi, struct file *bf); diff --git a/fs/incfs/format.c b/fs/incfs/format.c index 96f4e3d54f58..1a7c4646a291 100644 --- a/fs/incfs/format.c +++ b/fs/incfs/format.c @@ -215,7 +215,7 @@ static int append_md_to_backing_file(struct backing_file_context *bfc, return result; } -int incfs_update_file_header_flags(struct backing_file_context *bfc, u32 flags) +int incfs_write_file_header_flags(struct backing_file_context *bfc, u32 flags) { if (!bfc) return -EFAULT; diff --git a/fs/incfs/format.h b/fs/incfs/format.h index 33e5ea4eba56..deb5ca5bb0da 100644 --- a/fs/incfs/format.h +++ b/fs/incfs/format.h @@ -311,7 +311,7 @@ int incfs_write_file_attr_to_backing_file(struct backing_file_context *bfc, int incfs_write_signature_to_backing_file(struct backing_file_context *bfc, struct mem_range sig, u32 tree_size); -int incfs_update_file_header_flags(struct backing_file_context *bfc, u32 flags); +int incfs_write_file_header_flags(struct backing_file_context *bfc, u32 flags); int incfs_make_empty_backing_file(struct backing_file_context *bfc, incfs_uuid_t *uuid, u64 file_size); diff --git a/fs/incfs/vfs.c b/fs/incfs/vfs.c index ffa5b7ef9d5e..7c9982c2708b 100644 --- a/fs/incfs/vfs.c +++ b/fs/incfs/vfs.c @@ -347,8 +347,8 @@ static int inode_test(struct inode *inode, void *opaque) return (node->n_backing_inode == backing_inode) && inode->i_ino == search->ino; - } - return 1; + } else + return inode->i_ino == search->ino; } static int inode_set(struct inode *inode, void *opaque) @@ -894,6 +894,7 @@ static int init_new_file(struct mount_info *mi, struct dentry *dentry, } bfc = incfs_alloc_bfc(new_file); + fput(new_file); if (IS_ERR(bfc)) { error = PTR_ERR(bfc); bfc = NULL; @@ -1444,6 +1445,9 @@ static long ioctl_get_filled_blocks(struct file *f, void __user *arg) if (!df) return -EINVAL; + if ((uintptr_t)f->private_data != CAN_FILL) + return -EPERM; + if (copy_from_user(&args, args_usr_ptr, sizeof(args)) > 0) return -EINVAL; @@ -1676,6 +1680,7 @@ static int final_file_delete(struct mount_info *mi, if (d_really_is_positive(index_file_dentry)) error = incfs_unlink(index_file_dentry); out: + dput(index_file_dentry); if (error) pr_debug("incfs: delete_file_from_index err:%d\n", error); return error; @@ -1978,6 +1983,7 @@ static void dentry_release(struct dentry *d) if (di) path_put(&di->backing_path); + kfree(d->d_fsdata); d->d_fsdata = NULL; } @@ -2189,7 +2195,7 @@ struct dentry *incfs_mount_fs(struct file_system_type *type, int flags, path_put(&backing_dir_path); sb->s_flags |= SB_ACTIVE; - pr_debug("infs: mount\n"); + pr_debug("incfs: mount\n"); return dget(sb->s_root); err: sb->s_fs_info = NULL; @@ -2210,12 +2216,11 @@ static int incfs_remount_fs(struct super_block *sb, int *flags, char *data) if (err) return err; - if (mi->mi_options.read_timeout_ms != options.read_timeout_ms) { - mi->mi_options.read_timeout_ms = options.read_timeout_ms; - pr_debug("incfs: new timeout_ms=%d", options.read_timeout_ms); - } + err = incfs_realloc_mount_info(mi, &options); + if (err) + return err; - pr_debug("infs: remount\n"); + pr_debug("incfs: remount\n"); return 0; } @@ -2223,7 +2228,7 @@ void incfs_kill_sb(struct super_block *sb) { struct mount_info *mi = sb->s_fs_info; - pr_debug("infs: unmount\n"); + pr_debug("incfs: unmount\n"); incfs_free_mount_info(mi); generic_shutdown_super(sb); } diff --git a/include/linux/blk-crypto.h b/include/linux/blk-crypto.h index 2d871a7a0f5a..d383d3b320b9 100644 --- a/include/linux/blk-crypto.h +++ b/include/linux/blk-crypto.h @@ -20,6 +20,11 @@ int blk_crypto_init_key(struct blk_crypto_key *blk_key, enum blk_crypto_mode_num crypto_mode, unsigned int data_unit_size); +int blk_crypto_start_using_mode(enum blk_crypto_mode_num crypto_mode, + unsigned int data_unit_size, + bool is_hw_wrapped_key, + struct request_queue *q); + int blk_crypto_evict_key(struct request_queue *q, const struct blk_crypto_key *key); @@ -39,22 +44,10 @@ static inline bool blk_crypto_endio(struct bio *bio) #ifdef CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK -int blk_crypto_start_using_mode(enum blk_crypto_mode_num mode_num, - unsigned int data_unit_size, - struct request_queue *q); - int blk_crypto_fallback_init(void); #else /* CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK */ -static inline int -blk_crypto_start_using_mode(enum blk_crypto_mode_num mode_num, - unsigned int data_unit_size, - struct request_queue *q) -{ - return 0; -} - static inline int blk_crypto_fallback_init(void) { return 0; diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h index a9baeafa207a..40d7f8992d4e 100644 --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -104,7 +104,7 @@ struct ftrace_likely_data { unsigned long constant; }; -#ifdef CONFIG_ENABLE_MUST_CHECK +#if defined(CONFIG_ENABLE_MUST_CHECK) && !defined(__GENKSYMS__) #define __must_check __attribute__((__warn_unused_result__)) #else #define __must_check diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index cf3be353a2cc..486c1dd889f6 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -201,9 +201,6 @@ static inline bool policy_is_shared(struct cpufreq_policy *policy) return cpumask_weight(policy->cpus) > 1; } -/* /sys/devices/system/cpu/cpufreq: entry point for global variables */ -extern struct kobject *cpufreq_global_kobject; - #ifdef CONFIG_CPU_FREQ unsigned int cpufreq_get(unsigned int cpu); unsigned int cpufreq_quick_get(unsigned int cpu); diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 61f2f6ff9467..d8a9836e0ead 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -44,6 +44,7 @@ struct vm_area_struct; #else #define ___GFP_NOLOCKDEP 0 #endif +#define ___GFP_CMA 0x1000000u /* If the above are modified, __GFP_BITS_SHIFT may need updating */ /* @@ -57,6 +58,7 @@ struct vm_area_struct; #define __GFP_HIGHMEM ((__force gfp_t)___GFP_HIGHMEM) #define __GFP_DMA32 ((__force gfp_t)___GFP_DMA32) #define __GFP_MOVABLE ((__force gfp_t)___GFP_MOVABLE) /* ZONE_MOVABLE allowed */ +#define __GFP_CMA ((__force gfp_t)___GFP_CMA) #define GFP_ZONEMASK (__GFP_DMA|__GFP_HIGHMEM|__GFP_DMA32|__GFP_MOVABLE) /** @@ -217,8 +219,13 @@ struct vm_area_struct; #define __GFP_NOLOCKDEP ((__force gfp_t)___GFP_NOLOCKDEP) /* Room for N __GFP_FOO bits */ -#define __GFP_BITS_SHIFT (23 + IS_ENABLED(CONFIG_LOCKDEP)) +#define __GFP_BITS_SHIFT (25) +#ifdef CONFIG_LOCKDEP #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1)) +#else +#define __GFP_BITS_MASK (((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1)) & \ + ~0x800000u) +#endif /** * DOC: Useful GFP flag combinations diff --git a/include/linux/highmem.h b/include/linux/highmem.h index ea5cdbd8c2c3..9d6afc38bed1 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -205,7 +205,12 @@ static inline struct page * alloc_zeroed_user_highpage_movable(struct vm_area_struct *vma, unsigned long vaddr) { +#ifndef CONFIG_CMA return __alloc_zeroed_user_highpage(__GFP_MOVABLE, vma, vaddr); +#else + return __alloc_zeroed_user_highpage(__GFP_MOVABLE|__GFP_CMA, vma, + vaddr); +#endif } static inline void clear_highpage(struct page *page) diff --git a/include/linux/ion.h b/include/linux/ion.h index fa86bcce6e8f..088705119b16 100644 --- a/include/linux/ion.h +++ b/include/linux/ion.h @@ -144,6 +144,18 @@ struct ion_heap { #define ion_device_add_heap(heap) __ion_device_add_heap(heap, THIS_MODULE) +/** + * struct ion_dma_buf_attachment - hold device-table attachment data for buffer + * @dev: device attached to the buffer. + * @table: cached mapping. + * @list: list of ion_dma_buf_attachment. + */ +struct ion_dma_buf_attachment { + struct device *dev; + struct sg_table *table; + struct list_head list; +}; + #ifdef CONFIG_ION /** diff --git a/include/linux/keyslot-manager.h b/include/linux/keyslot-manager.h index 2f4aac2851bf..cd65bea927db 100644 --- a/include/linux/keyslot-manager.h +++ b/include/linux/keyslot-manager.h @@ -8,6 +8,15 @@ #include +/* Inline crypto feature bits. Must set at least one. */ +enum { + /* Support for standard software-specified keys */ + BLK_CRYPTO_FEATURE_STANDARD_KEYS = BIT(0), + + /* Support for hardware-wrapped keys */ + BLK_CRYPTO_FEATURE_WRAPPED_KEYS = BIT(1), +}; + #ifdef CONFIG_BLK_INLINE_ENCRYPTION struct keyslot_manager; @@ -45,6 +54,7 @@ struct keyslot_manager *keyslot_manager_create( struct device *dev, unsigned int num_slots, const struct keyslot_mgmt_ll_ops *ksm_ops, + unsigned int features, const unsigned int crypto_mode_supported[BLK_ENCRYPTION_MODE_MAX], void *ll_priv_data); @@ -57,7 +67,8 @@ void keyslot_manager_put_slot(struct keyslot_manager *ksm, unsigned int slot); bool keyslot_manager_crypto_mode_supported(struct keyslot_manager *ksm, enum blk_crypto_mode_num crypto_mode, - unsigned int data_unit_size); + unsigned int data_unit_size, + bool is_hw_wrapped_key); int keyslot_manager_evict_key(struct keyslot_manager *ksm, const struct blk_crypto_key *key); @@ -71,6 +82,7 @@ void keyslot_manager_destroy(struct keyslot_manager *ksm); struct keyslot_manager *keyslot_manager_create_passthrough( struct device *dev, const struct keyslot_mgmt_ll_ops *ksm_ops, + unsigned int features, const unsigned int crypto_mode_supported[BLK_ENCRYPTION_MODE_MAX], void *ll_priv_data); diff --git a/include/linux/mfd/sc27xx-pmic.h b/include/linux/mfd/sc27xx-pmic.h new file mode 100644 index 000000000000..57e45c0b3ae2 --- /dev/null +++ b/include/linux/mfd/sc27xx-pmic.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __LINUX_MFD_SC27XX_PMIC_H +#define __LINUX_MFD_SC27XX_PMIC_H + +extern enum usb_charger_type sprd_pmic_detect_charger_type(struct device *dev); + +#endif /* __LINUX_MFD_SC27XX_PMIC_H */ diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 4c5eb3aa8e72..94e3c87c1a58 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -463,6 +463,9 @@ struct mmc_host { bool cqe_enabled; bool cqe_on; + /* Host Software Queue support */ + bool hsq_enabled; + unsigned long private[0] ____cacheline_aligned; }; diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 7a7cf11200f9..0eb66b3f02a4 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -43,8 +43,6 @@ enum migratetype { MIGRATE_UNMOVABLE, MIGRATE_MOVABLE, MIGRATE_RECLAIMABLE, - MIGRATE_PCPTYPES, /* the number of types on the pcp lists */ - MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES, #ifdef CONFIG_CMA /* * MIGRATE_CMA migration type is designed to mimic the way @@ -61,6 +59,8 @@ enum migratetype { */ MIGRATE_CMA, #endif + MIGRATE_PCPTYPES, /* the number of types on the pcp lists */ + MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES, #ifdef CONFIG_MEMORY_ISOLATION MIGRATE_ISOLATE, /* can't allocate from here */ #endif @@ -73,9 +73,11 @@ extern const char * const migratetype_names[MIGRATE_TYPES]; #ifdef CONFIG_CMA # define is_migrate_cma(migratetype) unlikely((migratetype) == MIGRATE_CMA) # define is_migrate_cma_page(_page) (get_pageblock_migratetype(_page) == MIGRATE_CMA) +# define get_cma_migrate_type() MIGRATE_CMA #else # define is_migrate_cma(migratetype) false # define is_migrate_cma_page(_page) false +# define get_cma_migrate_type() MIGRATE_MOVABLE #endif static inline bool is_migrate_movable(int mt) @@ -444,6 +446,10 @@ struct zone { struct pglist_data *zone_pgdat; struct per_cpu_pageset __percpu *pageset; +#ifdef CONFIG_CMA + bool cma_alloc; +#endif + #ifndef CONFIG_SPARSEMEM /* * Flags for a pageblock_nr_pages block. See pageblock-flags.h. diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index dcd5a71e6c67..8670e90c1d51 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -61,6 +61,9 @@ enum { POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE, POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE, POWER_SUPPLY_HEALTH_OVERCURRENT, + POWER_SUPPLY_HEALTH_WARM, + POWER_SUPPLY_HEALTH_COOL, + POWER_SUPPLY_HEALTH_HOT, }; enum { diff --git a/include/linux/wakeup_reason.h b/include/linux/wakeup_reason.h index 9fbe209c7177..54f5caaa5cde 100644 --- a/include/linux/wakeup_reason.h +++ b/include/linux/wakeup_reason.h @@ -20,11 +20,18 @@ #define MAX_SUSPEND_ABORT_LEN 256 -void log_wakeup_reason(int irq); #ifdef CONFIG_SUSPEND +void log_irq_wakeup_reason(int irq); +void log_threaded_irq_wakeup_reason(int irq, int parent_irq); void log_suspend_abort_reason(const char *fmt, ...); +void log_abnormal_wakeup_reason(const char *fmt, ...); +void clear_wakeup_reasons(void); #else +static inline void log_irq_wakeup_reason(int irq) { } +static inline void log_threaded_irq_wakeup_reason(int irq, int parent_irq) { } static inline void log_suspend_abort_reason(const char *fmt, ...) { } +static inline void log_abnormal_wakeup_reason(const char *fmt, ...) { } +static inline void clear_wakeup_reasons(void) { } #endif #endif /* _LINUX_WAKEUP_REASON_H */ diff --git a/include/uapi/linux/coresight-stm.h b/include/uapi/linux/coresight-stm.h index aac550a52f80..8847dbf24151 100644 --- a/include/uapi/linux/coresight-stm.h +++ b/include/uapi/linux/coresight-stm.h @@ -2,8 +2,10 @@ #ifndef __UAPI_CORESIGHT_STM_H_ #define __UAPI_CORESIGHT_STM_H_ -#define STM_FLAG_TIMESTAMPED BIT(3) -#define STM_FLAG_GUARANTEED BIT(7) +#include + +#define STM_FLAG_TIMESTAMPED _BITUL(3) +#define STM_FLAG_GUARANTEED _BITUL(7) /* * The CoreSight STM supports guaranteed and invariant timing diff --git a/include/uapi/linux/incrementalfs.h b/include/uapi/linux/incrementalfs.h index 2d535d365ce9..13c3d5173e14 100644 --- a/include/uapi/linux/incrementalfs.h +++ b/include/uapi/linux/incrementalfs.h @@ -321,6 +321,9 @@ struct incfs_get_filled_blocks_args { /* Actual number of blocks in file */ __u32 total_blocks_out; + /* The number of data blocks in file */ + __u32 data_blocks_out; + /* Number of bytes written to range buffer */ __u32 range_buffer_size_out; diff --git a/init/Kconfig.gki b/init/Kconfig.gki index 8c2f1890db27..7c73d07d991a 100644 --- a/init/Kconfig.gki +++ b/init/Kconfig.gki @@ -44,6 +44,7 @@ config GKI_HIDDEN_SND_SOC_CONFIGS select SND_SOC_GENERIC_DMAENGINE_PCM if (SND_SOC && SND) select SND_PCM_IEC958 select SND_SOC_COMPRESS if (SND_SOC && SND) + select SND_SOC_TOPOLOGY if (SND_SOC && SND) help Dummy config option used to enable hidden SND_SOC configs. These are normally selected implicitly when a module diff --git a/init/Makefile b/init/Makefile index 6246a06364d0..30aa8ab11120 100644 --- a/init/Makefile +++ b/init/Makefile @@ -35,4 +35,4 @@ include/generated/compile.h: FORCE @$($(quiet)chk_compile.h) $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \ "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" \ - "$(CONFIG_PREEMPT_RT)" "$(CC) $(KBUILD_CFLAGS)" + "$(CONFIG_PREEMPT_RT)" "$(CC) $(KBUILD_CFLAGS)" "$(LD)" diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index b3fa2d87d2f3..d78904ddf9a8 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -507,8 +508,22 @@ static bool irq_may_run(struct irq_desc *desc) * If the interrupt is not in progress and is not an armed * wakeup interrupt, proceed. */ - if (!irqd_has_set(&desc->irq_data, mask)) + if (!irqd_has_set(&desc->irq_data, mask)) { +#ifdef CONFIG_PM_SLEEP + if (unlikely(desc->no_suspend_depth && + irqd_is_wakeup_set(&desc->irq_data))) { + unsigned int irq = irq_desc_get_irq(desc); + const char *name = "(unnamed)"; + + if (desc->action && desc->action->name) + name = desc->action->name; + + log_abnormal_wakeup_reason("misconfigured IRQ %u %s", + irq, name); + } +#endif return true; + } /* * If the interrupt is an armed wakeup source, mark it pending diff --git a/kernel/kmod.c b/kernel/kmod.c index bc6addd9152b..a2de58de6ab6 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c @@ -120,7 +120,7 @@ out: * invoke it. * * If module auto-loading support is disabled then this function - * becomes a no-operation. + * simply returns -ENOENT. */ int __request_module(bool wait, const char *fmt, ...) { @@ -137,7 +137,7 @@ int __request_module(bool wait, const char *fmt, ...) WARN_ON_ONCE(wait && current_is_async()); if (!modprobe_path[0]) - return 0; + return -ENOENT; va_start(args, fmt); ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args); diff --git a/kernel/padata.c b/kernel/padata.c index fda7a7039422..c4b774331e46 100644 --- a/kernel/padata.c +++ b/kernel/padata.c @@ -516,7 +516,7 @@ static int padata_replace(struct padata_instance *pinst) { int notification_mask = 0; struct padata_shell *ps; - int err; + int err = 0; pinst->flags |= PADATA_RESET; @@ -643,8 +643,8 @@ int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, struct cpumask *serial_mask, *parallel_mask; int err = -EINVAL; - mutex_lock(&pinst->lock); get_online_cpus(); + mutex_lock(&pinst->lock); switch (cpumask_type) { case PADATA_CPU_PARALLEL: @@ -662,8 +662,8 @@ int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, err = __padata_set_cpumasks(pinst, parallel_mask, serial_mask); out: - put_online_cpus(); mutex_unlock(&pinst->lock); + put_online_cpus(); return err; } diff --git a/kernel/power/process.c b/kernel/power/process.c index dfd2494543c1..da378ace6d0a 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c @@ -22,7 +22,6 @@ #include #include #include -#include /* * Timeout for stopping processes @@ -39,9 +38,6 @@ static int try_to_freeze_tasks(bool user_only) unsigned int elapsed_msecs; bool wakeup = false; int sleep_usecs = USEC_PER_MSEC; -#ifdef CONFIG_PM_SLEEP - char suspend_abort[MAX_SUSPEND_ABORT_LEN]; -#endif start = ktime_get_boottime(); @@ -71,11 +67,6 @@ static int try_to_freeze_tasks(bool user_only) break; if (pm_wakeup_pending()) { -#ifdef CONFIG_PM_SLEEP - pm_get_active_wakeup_sources(suspend_abort, - MAX_SUSPEND_ABORT_LEN); - log_suspend_abort_reason(suspend_abort); -#endif wakeup = true; break; } diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index ba1439aef895..44dfe0b3dfa7 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -140,6 +140,7 @@ static void s2idle_loop(void) } pm_wakeup_clear(false); + clear_wakeup_reasons(); s2idle_enter(); } @@ -362,6 +363,7 @@ static int suspend_prepare(suspend_state_t state) if (!error) return 0; + log_suspend_abort_reason("One or more tasks refusing to freeze"); suspend_stats.failed_freeze++; dpm_save_failed_step(SUSPEND_FREEZE); Finish: @@ -391,7 +393,6 @@ void __weak arch_suspend_enable_irqs(void) */ static int suspend_enter(suspend_state_t state, bool *wakeup) { - char suspend_abort[MAX_SUSPEND_ABORT_LEN]; int error, last_dev; error = platform_suspend_prepare(state); @@ -403,8 +404,8 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) last_dev = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1; last_dev %= REC_FAILED_NUM; pr_err("late suspend of devices failed\n"); - log_suspend_abort_reason("%s device failed to power down", - suspend_stats.failed_devs[last_dev]); + log_suspend_abort_reason("late suspend of %s device failed", + suspend_stats.failed_devs[last_dev]); goto Platform_finish; } error = platform_suspend_prepare_late(state); @@ -417,7 +418,7 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) last_dev %= REC_FAILED_NUM; pr_err("noirq suspend of devices failed\n"); log_suspend_abort_reason("noirq suspend of %s device failed", - suspend_stats.failed_devs[last_dev]); + suspend_stats.failed_devs[last_dev]); goto Platform_early_resume; } error = platform_suspend_prepare_noirq(state); @@ -453,9 +454,6 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) trace_suspend_resume(TPS("machine_suspend"), state, false); } else if (*wakeup) { - pm_get_active_wakeup_sources(suspend_abort, - MAX_SUSPEND_ABORT_LEN); - log_suspend_abort_reason(suspend_abort); error = -EBUSY; } syscore_resume(); @@ -490,7 +488,7 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) */ int suspend_devices_and_enter(suspend_state_t state) { - int error, last_dev; + int error; bool wakeup = false; if (!sleep_state_supported(state)) @@ -509,11 +507,9 @@ int suspend_devices_and_enter(suspend_state_t state) suspend_test_start(); error = dpm_suspend_start(PMSG_SUSPEND); if (error) { - last_dev = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1; - last_dev %= REC_FAILED_NUM; pr_err("Some devices failed to suspend, or early wake event detected\n"); - log_suspend_abort_reason("%s device failed to suspend, or early wake event detected", - suspend_stats.failed_devs[last_dev]); + log_suspend_abort_reason( + "Some devices failed to suspend, or early wake event detected"); goto Recover_platform; } suspend_test_finish("suspend devices"); diff --git a/kernel/power/wakeup_reason.c b/kernel/power/wakeup_reason.c index 3ce5c902e3d3..503a71fc49fc 100644 --- a/kernel/power/wakeup_reason.c +++ b/kernel/power/wakeup_reason.c @@ -4,7 +4,7 @@ * Logs the reasons which caused the kernel to resume from * the suspend mode. * - * Copyright (C) 2014 Google, Inc. + * Copyright (C) 2020 Google, Inc. * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. @@ -26,42 +26,282 @@ #include #include #include +#include +/* + * struct wakeup_irq_node - stores data and relationships for IRQs logged as + * either base or nested wakeup reasons during suspend/resume flow. + * @siblings - for membership on leaf or parent IRQ lists + * @irq - the IRQ number + * @irq_name - the name associated with the IRQ, or a default if none + */ +struct wakeup_irq_node { + struct list_head siblings; + int irq; + const char *irq_name; +}; -#define MAX_WAKEUP_REASON_IRQS 32 -static int irq_list[MAX_WAKEUP_REASON_IRQS]; -static int irqcount; +static DEFINE_SPINLOCK(wakeup_reason_lock); + +static LIST_HEAD(leaf_irqs); /* kept in ascending IRQ sorted order */ +static LIST_HEAD(parent_irqs); /* unordered */ + +static struct kmem_cache *wakeup_irq_nodes_cache; + +static const char *default_irq_name = "(unnamed)"; + +static struct kobject *kobj; + +static bool capture_reasons; static bool suspend_abort; -static char abort_reason[MAX_SUSPEND_ABORT_LEN]; -static struct kobject *wakeup_reason; -static spinlock_t resume_reason_lock; +static bool abnormal_wake; +static char non_irq_wake_reason[MAX_SUSPEND_ABORT_LEN]; static ktime_t last_monotime; /* monotonic time before last suspend */ static ktime_t curr_monotime; /* monotonic time after last suspend */ static ktime_t last_stime; /* monotonic boottime offset before last suspend */ static ktime_t curr_stime; /* monotonic boottime offset after last suspend */ -static ssize_t last_resume_reason_show(struct kobject *kobj, struct kobj_attribute *attr, - char *buf) +static void init_node(struct wakeup_irq_node *p, int irq) { - int irq_no, buf_offset = 0; struct irq_desc *desc; - unsigned long flags; - spin_lock_irqsave(&resume_reason_lock, flags); - if (suspend_abort) { - buf_offset = sprintf(buf, "Abort: %s", abort_reason); - } else { - for (irq_no = 0; irq_no < irqcount; irq_no++) { - desc = irq_to_desc(irq_list[irq_no]); - if (desc && desc->action && desc->action->name) - buf_offset += sprintf(buf + buf_offset, "%d %s\n", - irq_list[irq_no], desc->action->name); + + INIT_LIST_HEAD(&p->siblings); + + p->irq = irq; + desc = irq_to_desc(irq); + if (desc && desc->action && desc->action->name) + p->irq_name = desc->action->name; + else + p->irq_name = default_irq_name; +} + +static struct wakeup_irq_node *create_node(int irq) +{ + struct wakeup_irq_node *result; + + result = kmem_cache_alloc(wakeup_irq_nodes_cache, GFP_ATOMIC); + if (unlikely(!result)) + pr_warn("Failed to log wakeup IRQ %d\n", irq); + else + init_node(result, irq); + + return result; +} + +static void delete_list(struct list_head *head) +{ + struct wakeup_irq_node *n; + + while (!list_empty(head)) { + n = list_first_entry(head, struct wakeup_irq_node, siblings); + list_del(&n->siblings); + kmem_cache_free(wakeup_irq_nodes_cache, n); + } +} + +static bool add_sibling_node_sorted(struct list_head *head, int irq) +{ + struct wakeup_irq_node *n; + struct list_head *predecessor = head; + + if (unlikely(WARN_ON(!head))) + return NULL; + + if (!list_empty(head)) + list_for_each_entry(n, head, siblings) { + if (n->irq < irq) + predecessor = &n->siblings; + else if (n->irq == irq) + return true; else - buf_offset += sprintf(buf + buf_offset, "%d\n", - irq_list[irq_no]); + break; + } + + n = create_node(irq); + if (n) { + list_add(&n->siblings, predecessor); + return true; + } + + return false; +} + +static struct wakeup_irq_node *find_node_in_list(struct list_head *head, + int irq) +{ + struct wakeup_irq_node *n; + + if (unlikely(WARN_ON(!head))) + return NULL; + + list_for_each_entry(n, head, siblings) + if (n->irq == irq) + return n; + + return NULL; +} + +void log_irq_wakeup_reason(int irq) +{ + unsigned long flags; + + spin_lock_irqsave(&wakeup_reason_lock, flags); + + if (!capture_reasons) { + spin_unlock_irqrestore(&wakeup_reason_lock, flags); + return; + } + + if (find_node_in_list(&parent_irqs, irq) == NULL) + add_sibling_node_sorted(&leaf_irqs, irq); + + spin_unlock_irqrestore(&wakeup_reason_lock, flags); +} + +void log_threaded_irq_wakeup_reason(int irq, int parent_irq) +{ + struct wakeup_irq_node *parent; + unsigned long flags; + + /* + * Intentionally unsynchronized. Calls that come in after we have + * resumed should have a fast exit path since there's no work to be + * done, any any coherence issue that could cause a wrong value here is + * both highly improbable - given the set/clear timing - and very low + * impact (parent IRQ gets logged instead of the specific child). + */ + if (!capture_reasons) + return; + + spin_lock_irqsave(&wakeup_reason_lock, flags); + + if (!capture_reasons || (find_node_in_list(&leaf_irqs, irq) != NULL)) { + spin_unlock_irqrestore(&wakeup_reason_lock, flags); + return; + } + + parent = find_node_in_list(&parent_irqs, parent_irq); + if (parent != NULL) + add_sibling_node_sorted(&leaf_irqs, irq); + else { + parent = find_node_in_list(&leaf_irqs, parent_irq); + if (parent != NULL) { + list_del_init(&parent->siblings); + list_add_tail(&parent->siblings, &parent_irqs); + add_sibling_node_sorted(&leaf_irqs, irq); } } - spin_unlock_irqrestore(&resume_reason_lock, flags); + + spin_unlock_irqrestore(&wakeup_reason_lock, flags); +} + +void __log_abort_or_abnormal_wake(bool abort, const char *fmt, va_list args) +{ + unsigned long flags; + + spin_lock_irqsave(&wakeup_reason_lock, flags); + + /* Suspend abort or abnormal wake reason has already been logged. */ + if (suspend_abort || abnormal_wake) { + spin_unlock_irqrestore(&wakeup_reason_lock, flags); + return; + } + + suspend_abort = abort; + abnormal_wake = !abort; + vsnprintf(non_irq_wake_reason, MAX_SUSPEND_ABORT_LEN, fmt, args); + + spin_unlock_irqrestore(&wakeup_reason_lock, flags); +} + +void log_suspend_abort_reason(const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + __log_abort_or_abnormal_wake(true, fmt, args); + va_end(args); +} + +void log_abnormal_wakeup_reason(const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + __log_abort_or_abnormal_wake(false, fmt, args); + va_end(args); +} + +void clear_wakeup_reasons(void) +{ + unsigned long flags; + + spin_lock_irqsave(&wakeup_reason_lock, flags); + + delete_list(&leaf_irqs); + delete_list(&parent_irqs); + suspend_abort = false; + abnormal_wake = false; + capture_reasons = true; + + spin_unlock_irqrestore(&wakeup_reason_lock, flags); +} + +static void print_wakeup_sources(void) +{ + struct wakeup_irq_node *n; + unsigned long flags; + + spin_lock_irqsave(&wakeup_reason_lock, flags); + + capture_reasons = false; + + if (suspend_abort) { + pr_info("Abort: %s\n", non_irq_wake_reason); + spin_unlock_irqrestore(&wakeup_reason_lock, flags); + return; + } + + if (!list_empty(&leaf_irqs)) + list_for_each_entry(n, &leaf_irqs, siblings) + pr_info("Resume caused by IRQ %d, %s\n", n->irq, + n->irq_name); + else if (abnormal_wake) + pr_info("Resume caused by %s\n", non_irq_wake_reason); + else + pr_info("Resume cause unknown\n"); + + spin_unlock_irqrestore(&wakeup_reason_lock, flags); +} + +static ssize_t last_resume_reason_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + ssize_t buf_offset = 0; + struct wakeup_irq_node *n; + unsigned long flags; + + spin_lock_irqsave(&wakeup_reason_lock, flags); + + if (suspend_abort) { + buf_offset = scnprintf(buf, PAGE_SIZE, "Abort: %s", + non_irq_wake_reason); + spin_unlock_irqrestore(&wakeup_reason_lock, flags); + return buf_offset; + } + + if (!list_empty(&leaf_irqs)) + list_for_each_entry(n, &leaf_irqs, siblings) + buf_offset += scnprintf(buf + buf_offset, + PAGE_SIZE - buf_offset, + "%d %s\n", n->irq, n->irq_name); + else if (abnormal_wake) + buf_offset = scnprintf(buf, PAGE_SIZE, "-1 %s", + non_irq_wake_reason); + + spin_unlock_irqrestore(&wakeup_reason_lock, flags); + return buf_offset; } @@ -90,8 +330,8 @@ static ssize_t last_suspend_time_show(struct kobject *kobj, /* Export suspend_resume_time and sleep_time in pair here. */ return sprintf(buf, "%llu.%09lu %llu.%09lu\n", - suspend_resume_time.tv_sec, suspend_resume_time.tv_nsec, - sleep_time.tv_sec, sleep_time.tv_nsec); + suspend_resume_time.tv_sec, suspend_resume_time.tv_nsec, + sleep_time.tv_sec, sleep_time.tv_nsec); } static struct kobj_attribute resume_reason = __ATTR_RO(last_resume_reason); @@ -106,74 +346,24 @@ static struct attribute_group attr_group = { .attrs = attrs, }; -/* - * logs all the wake up reasons to the kernel - * stores the irqs to expose them to the userspace via sysfs - */ -void log_wakeup_reason(int irq) -{ - struct irq_desc *desc; - unsigned long flags; - desc = irq_to_desc(irq); - if (desc && desc->action && desc->action->name) - printk(KERN_INFO "Resume caused by IRQ %d, %s\n", irq, - desc->action->name); - else - printk(KERN_INFO "Resume caused by IRQ %d\n", irq); - - spin_lock_irqsave(&resume_reason_lock, flags); - if (irqcount == MAX_WAKEUP_REASON_IRQS) { - spin_unlock_irqrestore(&resume_reason_lock, flags); - printk(KERN_WARNING "Resume caused by more than %d IRQs\n", - MAX_WAKEUP_REASON_IRQS); - return; - } - - irq_list[irqcount++] = irq; - spin_unlock_irqrestore(&resume_reason_lock, flags); -} - -void log_suspend_abort_reason(const char *fmt, ...) -{ - unsigned long flags; - va_list args; - - spin_lock_irqsave(&resume_reason_lock, flags); - - //Suspend abort reason has already been logged. - if (suspend_abort) { - spin_unlock_irqrestore(&resume_reason_lock, flags); - return; - } - - suspend_abort = true; - va_start(args, fmt); - vsnprintf(abort_reason, MAX_SUSPEND_ABORT_LEN, fmt, args); - va_end(args); - spin_unlock_irqrestore(&resume_reason_lock, flags); -} - /* Detects a suspend and clears all the previous wake up reasons*/ static int wakeup_reason_pm_event(struct notifier_block *notifier, unsigned long pm_event, void *unused) { - unsigned long flags; switch (pm_event) { case PM_SUSPEND_PREPARE: - spin_lock_irqsave(&resume_reason_lock, flags); - irqcount = 0; - suspend_abort = false; - spin_unlock_irqrestore(&resume_reason_lock, flags); /* monotonic time since boot */ last_monotime = ktime_get(); /* monotonic time since boot including the time spent in suspend */ last_stime = ktime_get_boottime(); + clear_wakeup_reasons(); break; case PM_POST_SUSPEND: /* monotonic time since boot */ curr_monotime = ktime_get(); /* monotonic time since boot including the time spent in suspend */ curr_stime = ktime_get_boottime(); + print_wakeup_sources(); break; default: break; @@ -185,31 +375,40 @@ static struct notifier_block wakeup_reason_pm_notifier_block = { .notifier_call = wakeup_reason_pm_event, }; -/* Initializes the sysfs parameter - * registers the pm_event notifier - */ int __init wakeup_reason_init(void) { - int retval; - spin_lock_init(&resume_reason_lock); - retval = register_pm_notifier(&wakeup_reason_pm_notifier_block); - if (retval) - printk(KERN_WARNING "[%s] failed to register PM notifier %d\n", - __func__, retval); + if (register_pm_notifier(&wakeup_reason_pm_notifier_block)) { + pr_warn("[%s] failed to register PM notifier\n", __func__); + goto fail; + } - wakeup_reason = kobject_create_and_add("wakeup_reasons", kernel_kobj); - if (!wakeup_reason) { - printk(KERN_WARNING "[%s] failed to create a sysfs kobject\n", - __func__); - return 1; + kobj = kobject_create_and_add("wakeup_reasons", kernel_kobj); + if (!kobj) { + pr_warn("[%s] failed to create a sysfs kobject\n", __func__); + goto fail_unregister_pm_notifier; } - retval = sysfs_create_group(wakeup_reason, &attr_group); - if (retval) { - kobject_put(wakeup_reason); - printk(KERN_WARNING "[%s] failed to create a sysfs group %d\n", - __func__, retval); + + if (sysfs_create_group(kobj, &attr_group)) { + pr_warn("[%s] failed to create a sysfs group\n", __func__); + goto fail_kobject_put; } + + wakeup_irq_nodes_cache = + kmem_cache_create("wakeup_irq_node_cache", + sizeof(struct wakeup_irq_node), 0, 0, NULL); + if (!wakeup_irq_nodes_cache) + goto fail_remove_group; + return 0; + +fail_remove_group: + sysfs_remove_group(kobj, &attr_group); +fail_kobject_put: + kobject_put(kobj); +fail_unregister_pm_notifier: + unregister_pm_notifier(&wakeup_reason_pm_notifier_block); +fail: + return 1; } late_initcall(wakeup_reason_init); diff --git a/kernel/sched/cpupri.c b/kernel/sched/cpupri.c index 1a2719e1350a..0033731a0797 100644 --- a/kernel/sched/cpupri.c +++ b/kernel/sched/cpupri.c @@ -41,8 +41,67 @@ static int convert_prio(int prio) return cpupri; } +static inline int __cpupri_find(struct cpupri *cp, struct task_struct *p, + struct cpumask *lowest_mask, int idx) +{ + struct cpupri_vec *vec = &cp->pri_to_cpu[idx]; + int skip = 0; + + if (!atomic_read(&(vec)->count)) + skip = 1; + /* + * When looking at the vector, we need to read the counter, + * do a memory barrier, then read the mask. + * + * Note: This is still all racey, but we can deal with it. + * Ideally, we only want to look at masks that are set. + * + * If a mask is not set, then the only thing wrong is that we + * did a little more work than necessary. + * + * If we read a zero count but the mask is set, because of the + * memory barriers, that can only happen when the highest prio + * task for a run queue has left the run queue, in which case, + * it will be followed by a pull. If the task we are processing + * fails to find a proper place to go, that pull request will + * pull this task if the run queue is running at a lower + * priority. + */ + smp_rmb(); + + /* Need to do the rmb for every iteration */ + if (skip) + return 0; + + if (cpumask_any_and(p->cpus_ptr, vec->mask) >= nr_cpu_ids) + return 0; + + if (lowest_mask) { + cpumask_and(lowest_mask, p->cpus_ptr, vec->mask); + + /* + * We have to ensure that we have at least one bit + * still set in the array, since the map could have + * been concurrently emptied between the first and + * second reads of vec->mask. If we hit this + * condition, simply act as though we never hit this + * priority level and continue on. + */ + if (cpumask_empty(lowest_mask)) + return 0; + } + + return 1; +} + +int cpupri_find(struct cpupri *cp, struct task_struct *p, + struct cpumask *lowest_mask) +{ + return cpupri_find_fitness(cp, p, lowest_mask, NULL); +} + /** - * cpupri_find - find the best (lowest-pri) CPU in the system + * cpupri_find_fitness - find the best (lowest-pri) CPU in the system * @cp: The cpupri context * @p: The task * @lowest_mask: A mask to fill in with selected CPUs (or NULL) @@ -58,84 +117,59 @@ static int convert_prio(int prio) * * Return: (int)bool - CPUs were found */ -int cpupri_find(struct cpupri *cp, struct task_struct *p, +int cpupri_find_fitness(struct cpupri *cp, struct task_struct *p, struct cpumask *lowest_mask, bool (*fitness_fn)(struct task_struct *p, int cpu)) { - int idx = 0; int task_pri = convert_prio(p->prio); + int idx, cpu; BUG_ON(task_pri >= CPUPRI_NR_PRIORITIES); for (idx = 0; idx < task_pri; idx++) { - struct cpupri_vec *vec = &cp->pri_to_cpu[idx]; - int skip = 0; - if (!atomic_read(&(vec)->count)) - skip = 1; - /* - * When looking at the vector, we need to read the counter, - * do a memory barrier, then read the mask. - * - * Note: This is still all racey, but we can deal with it. - * Ideally, we only want to look at masks that are set. - * - * If a mask is not set, then the only thing wrong is that we - * did a little more work than necessary. - * - * If we read a zero count but the mask is set, because of the - * memory barriers, that can only happen when the highest prio - * task for a run queue has left the run queue, in which case, - * it will be followed by a pull. If the task we are processing - * fails to find a proper place to go, that pull request will - * pull this task if the run queue is running at a lower - * priority. - */ - smp_rmb(); - - /* Need to do the rmb for every iteration */ - if (skip) + if (!__cpupri_find(cp, p, lowest_mask, idx)) continue; - if (cpumask_any_and(p->cpus_ptr, vec->mask) >= nr_cpu_ids) - continue; + if (!lowest_mask || !fitness_fn) + return 1; - if (lowest_mask) { - int cpu; - - cpumask_and(lowest_mask, p->cpus_ptr, vec->mask); - - /* - * We have to ensure that we have at least one bit - * still set in the array, since the map could have - * been concurrently emptied between the first and - * second reads of vec->mask. If we hit this - * condition, simply act as though we never hit this - * priority level and continue on. - */ - if (cpumask_empty(lowest_mask)) - continue; - - if (!fitness_fn) - return 1; - - /* Ensure the capacity of the CPUs fit the task */ - for_each_cpu(cpu, lowest_mask) { - if (!fitness_fn(p, cpu)) - cpumask_clear_cpu(cpu, lowest_mask); - } - - /* - * If no CPU at the current priority can fit the task - * continue looking - */ - if (cpumask_empty(lowest_mask)) - continue; + /* Ensure the capacity of the CPUs fit the task */ + for_each_cpu(cpu, lowest_mask) { + if (!fitness_fn(p, cpu)) + cpumask_clear_cpu(cpu, lowest_mask); } + /* + * If no CPU at the current priority can fit the task + * continue looking + */ + if (cpumask_empty(lowest_mask)) + continue; + return 1; } + /* + * If we failed to find a fitting lowest_mask, kick off a new search + * but without taking into account any fitness criteria this time. + * + * This rule favours honouring priority over fitting the task in the + * correct CPU (Capacity Awareness being the only user now). + * The idea is that if a higher priority task can run, then it should + * run even if this ends up being on unfitting CPU. + * + * The cost of this trade-off is not entirely clear and will probably + * be good for some workloads and bad for others. + * + * The main idea here is that if some CPUs were overcommitted, we try + * to spread which is what the scheduler traditionally did. Sys admins + * must do proper RT planning to avoid overloading the system if they + * really care. + */ + if (fitness_fn) + return cpupri_find(cp, p, lowest_mask); + return 0; } diff --git a/kernel/sched/cpupri.h b/kernel/sched/cpupri.h index 32dd520db11f..efbb492bb94c 100644 --- a/kernel/sched/cpupri.h +++ b/kernel/sched/cpupri.h @@ -19,8 +19,10 @@ struct cpupri { #ifdef CONFIG_SMP int cpupri_find(struct cpupri *cp, struct task_struct *p, - struct cpumask *lowest_mask, - bool (*fitness_fn)(struct task_struct *p, int cpu)); + struct cpumask *lowest_mask); +int cpupri_find_fitness(struct cpupri *cp, struct task_struct *p, + struct cpumask *lowest_mask, + bool (*fitness_fn)(struct task_struct *p, int cpu)); void cpupri_set(struct cpupri *cp, int cpu, int pri); int cpupri_init(struct cpupri *cp); void cpupri_cleanup(struct cpupri *cp); diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index f87c34afd5ad..6afc86f99a37 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -1474,6 +1474,13 @@ select_task_rq_rt(struct task_struct *p, int cpu, int sd_flag, int flags) if (test || !rt_task_fits_capacity(p, cpu)) { int target = find_lowest_rq(p); + /* + * Bail out if we were forcing a migration to find a better + * fitting CPU but our search failed. + */ + if (!test && target != -1 && !rt_task_fits_capacity(p, target)) + goto out_unlock; + /* * Don't bother moving it if the destination CPU is * not running a lower priority task. @@ -1482,6 +1489,8 @@ select_task_rq_rt(struct task_struct *p, int cpu, int sd_flag, int flags) p->prio < cpu_rq(target)->rt.highest_prio.curr) cpu = target; } + +out_unlock: rcu_read_unlock(); out: @@ -1495,7 +1504,7 @@ static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p) * let's hope p can move out. */ if (rq->curr->nr_cpus_allowed == 1 || - !cpupri_find(&rq->rd->cpupri, rq->curr, NULL, NULL)) + !cpupri_find(&rq->rd->cpupri, rq->curr, NULL)) return; /* @@ -1503,7 +1512,7 @@ static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p) * see if it is pushed or pulled somewhere else. */ if (p->nr_cpus_allowed != 1 && - cpupri_find(&rq->rd->cpupri, p, NULL, NULL)) + cpupri_find(&rq->rd->cpupri, p, NULL)) return; /* @@ -1650,8 +1659,7 @@ static void put_prev_task_rt(struct rq *rq, struct task_struct *p) static int pick_rt_task(struct rq *rq, struct task_struct *p, int cpu) { if (!task_running(rq, p) && - cpumask_test_cpu(cpu, p->cpus_ptr) && - rt_task_fits_capacity(p, cpu)) + cpumask_test_cpu(cpu, p->cpus_ptr)) return 1; return 0; @@ -1685,6 +1693,7 @@ static int find_lowest_rq(struct task_struct *task) struct cpumask *lowest_mask = this_cpu_cpumask_var_ptr(local_cpu_mask); int this_cpu = smp_processor_id(); int cpu = task_cpu(task); + int ret; /* Make sure the mask is initialized first */ if (unlikely(!lowest_mask)) @@ -1693,8 +1702,22 @@ static int find_lowest_rq(struct task_struct *task) if (task->nr_cpus_allowed == 1) return -1; /* No other targets possible */ - if (!cpupri_find(&task_rq(task)->rd->cpupri, task, lowest_mask, - rt_task_fits_capacity)) + /* + * If we're on asym system ensure we consider the different capacities + * of the CPUs when searching for the lowest_mask. + */ + if (static_branch_unlikely(&sched_asym_cpucapacity)) { + + ret = cpupri_find_fitness(&task_rq(task)->rd->cpupri, + task, lowest_mask, + rt_task_fits_capacity); + } else { + + ret = cpupri_find(&task_rq(task)->rd->cpupri, + task, lowest_mask); + } + + if (!ret) return -1; /* No targets found */ /* @@ -2205,7 +2228,7 @@ static void task_woken_rt(struct rq *rq, struct task_struct *p) (rq->curr->nr_cpus_allowed < 2 || rq->curr->prio <= p->prio); - if (need_to_push || !rt_task_fits_capacity(p, cpu_of(rq))) + if (need_to_push) push_rt_tasks(rq); } @@ -2277,10 +2300,7 @@ static void switched_to_rt(struct rq *rq, struct task_struct *p) */ if (task_on_rq_queued(p) && rq->curr != p) { #ifdef CONFIG_SMP - bool need_to_push = rq->rt.overloaded || - !rt_task_fits_capacity(p, cpu_of(rq)); - - if (p->nr_cpus_allowed > 1 && need_to_push) + if (p->nr_cpus_allowed > 1 && rq->rt.overloaded) rt_queue_push_tasks(rq); #endif /* CONFIG_SMP */ if (p->prio < rq->curr->prio && cpu_online(cpu_of(rq))) diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 3fdd25098876..81d99906a97c 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -1627,7 +1627,7 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq, struct work_struct *work = &dwork->work; WARN_ON_ONCE(!wq); -#ifndef CONFIG_CFI +#ifndef CONFIG_CFI_CLANG WARN_ON_ONCE(timer->function != delayed_work_timer_fn); #endif WARN_ON_ONCE(timer_pending(timer)); diff --git a/lib/test_xarray.c b/lib/test_xarray.c index 55c14e8c8859..8c7d7a8468b8 100644 --- a/lib/test_xarray.c +++ b/lib/test_xarray.c @@ -12,6 +12,9 @@ static unsigned int tests_run; static unsigned int tests_passed; +static const unsigned int order_limit = + IS_ENABLED(CONFIG_XARRAY_MULTI) ? BITS_PER_LONG : 1; + #ifndef XA_DEBUG # ifdef __KERNEL__ void xa_dump(const struct xarray *xa) { } @@ -959,6 +962,20 @@ static noinline void check_multi_find_2(struct xarray *xa) } } +static noinline void check_multi_find_3(struct xarray *xa) +{ + unsigned int order; + + for (order = 5; order < order_limit; order++) { + unsigned long index = 1UL << (order - 5); + + XA_BUG_ON(xa, !xa_empty(xa)); + xa_store_order(xa, 0, order - 4, xa_mk_index(0), GFP_KERNEL); + XA_BUG_ON(xa, xa_find_after(xa, &index, ULONG_MAX, XA_PRESENT)); + xa_erase_index(xa, 0); + } +} + static noinline void check_find_1(struct xarray *xa) { unsigned long i, j, k; @@ -1081,6 +1098,7 @@ static noinline void check_find(struct xarray *xa) for (i = 2; i < 10; i++) check_multi_find_1(xa, i); check_multi_find_2(xa); + check_multi_find_3(xa); } /* See find_swap_entry() in mm/shmem.c */ diff --git a/lib/xarray.c b/lib/xarray.c index 1d9fab7db8da..acd1fad2e862 100644 --- a/lib/xarray.c +++ b/lib/xarray.c @@ -1839,7 +1839,8 @@ static bool xas_sibling(struct xa_state *xas) if (!node) return false; mask = (XA_CHUNK_SIZE << node->shift) - 1; - return (xas->xa_index & mask) > (xas->xa_offset << node->shift); + return (xas->xa_index & mask) > + ((unsigned long)xas->xa_offset << node->shift); } /** diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 024a2465cd3f..4c60ba571c8e 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -2823,7 +2823,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) switch (mode) { case MPOL_PREFERRED: /* - * Insist on a nodelist of one node only + * Insist on a nodelist of one node only, although later + * we use first_node(nodes) to grab a single node, so here + * nodelist (or nodes) cannot be empty. */ if (nodelist) { char *rest = nodelist; @@ -2831,6 +2833,8 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) rest++; if (*rest) goto out; + if (nodes_empty(nodes)) + goto out; } break; case MPOL_INTERLEAVE: diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 323faf5229d2..f818142a3750 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -293,10 +293,10 @@ const char * const migratetype_names[MIGRATE_TYPES] = { "Unmovable", "Movable", "Reclaimable", - "HighAtomic", #ifdef CONFIG_CMA "CMA", #endif + "HighAtomic", #ifdef CONFIG_MEMORY_ISOLATION "Isolate", #endif @@ -2725,19 +2725,37 @@ __rmqueue(struct zone *zone, unsigned int order, int migratetype, retry: page = __rmqueue_smallest(zone, order, migratetype); - if (unlikely(!page)) { - if (migratetype == MIGRATE_MOVABLE) - page = __rmqueue_cma_fallback(zone, order); - if (!page && __rmqueue_fallback(zone, order, migratetype, - alloc_flags)) - goto retry; - } + if (unlikely(!page) && __rmqueue_fallback(zone, order, migratetype, + alloc_flags)) + goto retry; trace_mm_page_alloc_zone_locked(page, order, migratetype); return page; } +#ifdef CONFIG_CMA +static struct page *__rmqueue_cma(struct zone *zone, unsigned int order, + int migratetype, + unsigned int alloc_flags) +{ + struct page *page = 0; + + if (IS_ENABLED(CONFIG_CMA)) + if (!zone->cma_alloc) + page = __rmqueue_cma_fallback(zone, order); + trace_mm_page_alloc_zone_locked(page, order, MIGRATE_CMA); + return page; +} +#else +static inline struct page *__rmqueue_cma(struct zone *zone, unsigned int order, + int migratetype, + unsigned int alloc_flags) +{ + return NULL; +} +#endif + /* * Obtain a specified number of elements from the buddy allocator, all under * a single hold of the lock, for efficiency. Add them to the supplied list. @@ -2751,8 +2769,19 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order, spin_lock(&zone->lock); for (i = 0; i < count; ++i) { - struct page *page = __rmqueue(zone, order, migratetype, - alloc_flags); + struct page *page; + + /* + * If migrate type CMA is being requested only try to + * satisfy the request with CMA pages to try and increase + * CMA utlization. + */ + if (is_migrate_cma(migratetype)) + page = __rmqueue_cma(zone, order, migratetype, + alloc_flags); + else + page = __rmqueue(zone, order, migratetype, alloc_flags); + if (unlikely(page == NULL)) break; @@ -2787,6 +2816,28 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order, return alloced; } +/* + * Return the pcp list that corresponds to the migrate type if that list isn't + * empty. + * If the list is empty return NULL. + */ +static struct list_head *get_populated_pcp_list(struct zone *zone, + unsigned int order, struct per_cpu_pages *pcp, + int migratetype, unsigned int alloc_flags) +{ + struct list_head *list = &pcp->lists[migratetype]; + + if (list_empty(list)) { + pcp->count += rmqueue_bulk(zone, order, + pcp->batch, list, + migratetype, alloc_flags); + + if (list_empty(list)) + list = NULL; + } + return list; +} + #ifdef CONFIG_NUMA /* * Called from the vmstat counter updater to drain pagesets of this @@ -3216,16 +3267,28 @@ static inline void zone_statistics(struct zone *preferred_zone, struct zone *z) static struct page *__rmqueue_pcplist(struct zone *zone, int migratetype, unsigned int alloc_flags, struct per_cpu_pages *pcp, - struct list_head *list) + gfp_t gfp_flags) { - struct page *page; + struct page *page = NULL; + struct list_head *list = NULL; do { - if (list_empty(list)) { - pcp->count += rmqueue_bulk(zone, 0, - pcp->batch, list, + /* First try to get CMA pages */ + if (migratetype == MIGRATE_MOVABLE && + gfp_flags & __GFP_CMA) { + list = get_populated_pcp_list(zone, 0, pcp, + get_cma_migrate_type(), alloc_flags); + } + + if (list == NULL) { + /* + * Either CMA is not suitable or there are no + * free CMA pages. + */ + list = get_populated_pcp_list(zone, 0, pcp, migratetype, alloc_flags); - if (unlikely(list_empty(list))) + if (unlikely(list == NULL) || + unlikely(list_empty(list))) return NULL; } @@ -3243,14 +3306,13 @@ static struct page *rmqueue_pcplist(struct zone *preferred_zone, int migratetype, unsigned int alloc_flags) { struct per_cpu_pages *pcp; - struct list_head *list; struct page *page; unsigned long flags; local_irq_save(flags); pcp = &this_cpu_ptr(zone->pageset)->pcp; - list = &pcp->lists[migratetype]; - page = __rmqueue_pcplist(zone, migratetype, alloc_flags, pcp, list); + page = __rmqueue_pcplist(zone, migratetype, alloc_flags, pcp, + gfp_flags); if (page) { __count_zid_vm_events(PGALLOC, page_zonenum(page), 1); zone_statistics(preferred_zone, zone); @@ -3286,14 +3348,22 @@ struct page *rmqueue(struct zone *preferred_zone, do { page = NULL; + if (alloc_flags & ALLOC_HARDER) { page = __rmqueue_smallest(zone, order, MIGRATE_HIGHATOMIC); if (page) trace_mm_page_alloc_zone_locked(page, order, migratetype); } + + if (!page && migratetype == MIGRATE_MOVABLE && + gfp_flags & __GFP_CMA) + page = __rmqueue_cma(zone, order, migratetype, + alloc_flags); + if (!page) page = __rmqueue(zone, order, migratetype, alloc_flags); } while (page && check_new_pages(page, order)); + spin_unlock(&zone->lock); if (!page) goto failed; @@ -8442,6 +8512,9 @@ int alloc_contig_range(unsigned long start, unsigned long end, if (ret < 0) return ret; +#ifdef CONFIG_CMA + cc.zone->cma_alloc = 1; +#endif /* * In case of -EBUSY, we'd like to know which page causes problem. * So, just fall through. test_pages_isolated() has a tracepoint @@ -8523,6 +8596,9 @@ int alloc_contig_range(unsigned long start, unsigned long end, done: undo_isolate_page_range(pfn_max_align_down(start), pfn_max_align_up(end), migratetype); +#ifdef CONFIG_CMA + cc.zone->cma_alloc = 0; +#endif return ret; } #endif /* CONFIG_CONTIG_ALLOC */ diff --git a/net/core/dev.c b/net/core/dev.c index 931dfdcbabf1..c19c424197e3 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2795,6 +2795,8 @@ static u16 skb_tx_hash(const struct net_device *dev, if (skb_rx_queue_recorded(skb)) { hash = skb_get_rx_queue(skb); + if (hash >= qoffset) + hash -= qoffset; while (unlikely(hash >= qcount)) hash -= qcount; return hash + qoffset; diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 6f7155d91313..5af22c9712a6 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -6096,7 +6096,11 @@ static void tcp_rcv_synrecv_state_fastopen(struct sock *sk) { struct request_sock *req; - tcp_try_undo_loss(sk, false); + /* If we are still handling the SYNACK RTO, see if timestamp ECR allows + * undo. If peer SACKs triggered fast recovery, we can't undo here. + */ + if (inet_csk(sk)->icsk_ca_state == TCP_CA_Loss) + tcp_try_undo_loss(sk, false); /* Reset rtx states to prevent spurious retransmits_timed_out() */ tcp_sk(sk)->retrans_stamp = 0; diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c index 813fd6888142..136eb465bfcb 100644 --- a/net/rxrpc/sendmsg.c +++ b/net/rxrpc/sendmsg.c @@ -58,8 +58,8 @@ static int rxrpc_wait_for_tx_window_nonintr(struct rxrpc_sock *rx, rtt = READ_ONCE(call->peer->rtt); rtt2 = nsecs_to_jiffies64(rtt) * 2; - if (rtt2 < 1) - rtt2 = 1; + if (rtt2 < 2) + rtt2 = 2; timeout = rtt2; tx_start = READ_ONCE(call->tx_hard_ack); diff --git a/scripts/Kconfig.include b/scripts/Kconfig.include index bfb44b265a94..77a69ba9cd19 100644 --- a/scripts/Kconfig.include +++ b/scripts/Kconfig.include @@ -40,3 +40,10 @@ $(error-if,$(success, $(LD) -v | grep -q gold), gold linker '$(LD)' not supporte # gcc version including patch level gcc-version := $(shell,$(srctree)/scripts/gcc-version.sh $(CC)) + +# machine bit flags +# $(m32-flag): -m32 if the compiler supports it, or an empty string otherwise. +# $(m64-flag): -m64 if the compiler supports it, or an empty string otherwise. +cc-option-bit = $(if-success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null,$(1)) +m32-flag := $(cc-option-bit,-m32) +m64-flag := $(cc-option-bit,-m64) diff --git a/scripts/Makefile b/scripts/Makefile index 3e86b300f5a1..543603e3a789 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -31,6 +31,8 @@ always := $(hostprogs-y) $(hostprogs-m) # The following hostprogs-y programs are only build on demand hostprogs-y += unifdef +extra-$(CONFIG_LTO_CLANG) += module-lto.lds + subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins subdir-$(CONFIG_MODVERSIONS) += genksyms subdir-$(CONFIG_SECURITY_SELINUX) += selinux diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h index d1d757c6edf4..528edd041cdf 100755 --- a/scripts/mkcompile_h +++ b/scripts/mkcompile_h @@ -7,6 +7,7 @@ SMP=$3 PREEMPT=$4 PREEMPT_RT=$5 CC=$6 +LD=$7 vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; } @@ -74,7 +75,10 @@ UTS_TRUNCATE="cut -b -$UTS_LEN" echo \#define LINUX_COMPILE_BY \"`echo $LINUX_COMPILE_BY | $UTS_TRUNCATE`\" echo \#define LINUX_COMPILE_HOST \"`echo $LINUX_COMPILE_HOST | $UTS_TRUNCATE`\" - echo \#define LINUX_COMPILER \"`$CC -v 2>&1 | grep ' version ' | sed 's/[[:space:]]*$//'`\" + CC_VERSION=$($CC -v 2>&1 | grep ' version ' | sed 's/[[:space:]]*$//') + LD_VERSION=$($LD -v | head -n1 | sed 's/(compatible with [^)]*)//' \ + | sed 's/[[:space:]]*$//') + printf '#define LINUX_COMPILER "%s"\n' "$CC_VERSION, $LD_VERSION" } > .tmpcompile # Only replace the real compile.h if the new one is different, diff --git a/scripts/module-lto.lds b/scripts/module-lto.lds.S similarity index 68% rename from scripts/module-lto.lds rename to scripts/module-lto.lds.S index 5ba0e9461e13..c0f4fdeb84a0 100644 --- a/scripts/module-lto.lds +++ b/scripts/module-lto.lds.S @@ -1,3 +1,6 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include + /* * With CONFIG_LTO_CLANG, LLD always enables -fdata-sections and * -ffunction-sections, which increases the size of the final module. @@ -18,5 +21,14 @@ SECTIONS { .rela.rodata : { *(.rela.rodata .rela.rodata.[0-9a-zA-Z_]*) } .rela.text : { *(.rela.text .rela.text.[0-9a-zA-Z_]*) } .rodata : { *(.rodata .rodata.[0-9a-zA-Z_]*) } - .text : { *(.text .text.[0-9a-zA-Z_]*) } + + /* + * With CFI_CLANG, ensure __cfi_check is at the beginning of the + * .text section, and that the section is aligned to page size. + */ + .text : ALIGN(PAGE_SIZE) { + *(.text.__cfi_check) + *(.text .text.[0-9a-zA-Z_]* .text..L.cfi*) + } + } diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 32ed46464af7..adad3651889e 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c @@ -1180,6 +1180,7 @@ static const struct snd_pci_quirk ca0132_quirks[] = { SND_PCI_QUIRK(0x1458, 0xA016, "Recon3Di", QUIRK_R3DI), SND_PCI_QUIRK(0x1458, 0xA026, "Gigabyte G1.Sniper Z97", QUIRK_R3DI), SND_PCI_QUIRK(0x1458, 0xA036, "Gigabyte GA-Z170X-Gaming 7", QUIRK_R3DI), + SND_PCI_QUIRK(0x3842, 0x1038, "EVGA X99 Classified", QUIRK_R3DI), SND_PCI_QUIRK(0x1102, 0x0013, "Recon3D", QUIRK_R3D), SND_PCI_QUIRK(0x1102, 0x0051, "Sound Blaster AE-5", QUIRK_AE5), {} diff --git a/tools/power/x86/turbostat/Makefile b/tools/power/x86/turbostat/Makefile index 13f1e8b9ac52..2b6551269e43 100644 --- a/tools/power/x86/turbostat/Makefile +++ b/tools/power/x86/turbostat/Makefile @@ -16,7 +16,7 @@ override CFLAGS += -D_FORTIFY_SOURCE=2 %: %.c @mkdir -p $(BUILD_OUTPUT) - $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) + $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) -lcap .PHONY : clean clean : diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 5d0fddda842c..988326b67a91 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include @@ -304,6 +304,10 @@ int *irqs_per_cpu; /* indexed by cpu_num */ void setup_all_buffers(void); +char *sys_lpi_file; +char *sys_lpi_file_sysfs = "/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us"; +char *sys_lpi_file_debugfs = "/sys/kernel/debug/pmc_core/slp_s0_residency_usec"; + int cpu_is_not_present(int cpu) { return !CPU_ISSET_S(cpu, cpu_present_setsize, cpu_present_set); @@ -2916,8 +2920,6 @@ int snapshot_gfx_mhz(void) * * record snapshot of * /sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us - * - * return 1 if config change requires a restart, else return 0 */ int snapshot_cpu_lpi_us(void) { @@ -2941,17 +2943,14 @@ int snapshot_cpu_lpi_us(void) /* * snapshot_sys_lpi() * - * record snapshot of - * /sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us - * - * return 1 if config change requires a restart, else return 0 + * record snapshot of sys_lpi_file */ int snapshot_sys_lpi_us(void) { FILE *fp; int retval; - fp = fopen_or_die("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us", "r"); + fp = fopen_or_die(sys_lpi_file, "r"); retval = fscanf(fp, "%lld", &cpuidle_cur_sys_lpi_us); if (retval != 1) { @@ -3151,27 +3150,41 @@ void check_dev_msr() err(-5, "no /dev/cpu/0/msr, Try \"# modprobe msr\" "); } -void check_permissions() +/* + * check for CAP_SYS_RAWIO + * return 0 on success + * return 1 on fail + */ +int check_for_cap_sys_rawio(void) +{ + cap_t caps; + cap_flag_value_t cap_flag_value; + + caps = cap_get_proc(); + if (caps == NULL) + err(-6, "cap_get_proc\n"); + + if (cap_get_flag(caps, CAP_SYS_RAWIO, CAP_EFFECTIVE, &cap_flag_value)) + err(-6, "cap_get\n"); + + if (cap_flag_value != CAP_SET) { + warnx("capget(CAP_SYS_RAWIO) failed," + " try \"# setcap cap_sys_rawio=ep %s\"", progname); + return 1; + } + + if (cap_free(caps) == -1) + err(-6, "cap_free\n"); + + return 0; +} +void check_permissions(void) { - struct __user_cap_header_struct cap_header_data; - cap_user_header_t cap_header = &cap_header_data; - struct __user_cap_data_struct cap_data_data; - cap_user_data_t cap_data = &cap_data_data; - extern int capget(cap_user_header_t hdrp, cap_user_data_t datap); int do_exit = 0; char pathname[32]; /* check for CAP_SYS_RAWIO */ - cap_header->pid = getpid(); - cap_header->version = _LINUX_CAPABILITY_VERSION; - if (capget(cap_header, cap_data) < 0) - err(-6, "capget(2) failed"); - - if ((cap_data->effective & (1 << CAP_SYS_RAWIO)) == 0) { - do_exit++; - warnx("capget(CAP_SYS_RAWIO) failed," - " try \"# setcap cap_sys_rawio=ep %s\"", progname); - } + do_exit += check_for_cap_sys_rawio(); /* test file permissions */ sprintf(pathname, "/dev/cpu/%d/msr", base_cpu); @@ -4907,10 +4920,16 @@ void process_cpuid() else BIC_NOT_PRESENT(BIC_CPU_LPI); - if (!access("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us", R_OK)) + if (!access(sys_lpi_file_sysfs, R_OK)) { + sys_lpi_file = sys_lpi_file_sysfs; BIC_PRESENT(BIC_SYS_LPI); - else + } else if (!access(sys_lpi_file_debugfs, R_OK)) { + sys_lpi_file = sys_lpi_file_debugfs; + BIC_PRESENT(BIC_SYS_LPI); + } else { + sys_lpi_file_sysfs = NULL; BIC_NOT_PRESENT(BIC_SYS_LPI); + } if (!quiet) decode_misc_feature_control(); @@ -5323,9 +5342,9 @@ int add_counter(unsigned int msr_num, char *path, char *name, } msrp->msr_num = msr_num; - strncpy(msrp->name, name, NAME_BYTES); + strncpy(msrp->name, name, NAME_BYTES - 1); if (path) - strncpy(msrp->path, path, PATH_BYTES); + strncpy(msrp->path, path, PATH_BYTES - 1); msrp->width = width; msrp->type = type; msrp->format = format; diff --git a/tools/testing/selftests/filesystems/incfs/incfs_test.c b/tools/testing/selftests/filesystems/incfs/incfs_test.c index 723f9cbd15bc..3ba41bd75efe 100644 --- a/tools/testing/selftests/filesystems/incfs/incfs_test.c +++ b/tools/testing/selftests/filesystems/incfs/incfs_test.c @@ -1930,7 +1930,8 @@ failure: return TEST_FAILURE; } -static int validate_logs(char *mount_dir, int log_fd, struct test_file *file) +static int validate_logs(char *mount_dir, int log_fd, struct test_file *file, + bool no_rlog) { uint8_t data[INCFS_DATA_FILE_BLOCK_SIZE]; struct incfs_pending_read_info prs[100] = {}; @@ -1957,7 +1958,19 @@ static int validate_logs(char *mount_dir, int log_fd, struct test_file *file) goto failure; } - read_count = wait_for_pending_reads(log_fd, 0, prs, prs_size); + read_count = + wait_for_pending_reads(log_fd, no_rlog ? 10 : 0, prs, prs_size); + if (no_rlog) { + if (read_count == 0) + goto success; + if (read_count < 0) + ksft_print_msg("Error reading logged reads %s.\n", + strerror(-read_count)); + else + ksft_print_msg("Somehow read empty logs.\n"); + goto failure; + } + if (read_count < 0) { ksft_print_msg("Error reading logged reads %s.\n", strerror(-read_count)); @@ -2001,6 +2014,8 @@ static int validate_logs(char *mount_dir, int log_fd, struct test_file *file) goto failure; } } + +success: close(fd); return TEST_SUCCESS; @@ -2014,14 +2029,14 @@ static int read_log_test(char *mount_dir) struct test_files_set test = get_test_files_set(); const int file_num = test.files_count; int i = 0; - int cmd_fd = -1, log_fd = -1; + int cmd_fd = -1, log_fd = -1, drop_caches = -1; char *backing_dir; backing_dir = create_backing_dir(mount_dir); if (!backing_dir) goto failure; - if (mount_fs_opt(mount_dir, backing_dir, "readahead=0") != 0) + if (mount_fs_opt(mount_dir, backing_dir, "readahead=0", false) != 0) goto failure; cmd_fd = open_commands_file(mount_dir); @@ -2029,7 +2044,7 @@ static int read_log_test(char *mount_dir) goto failure; log_fd = open_log_file(mount_dir); - if (cmd_fd < 0) + if (log_fd < 0) ksft_print_msg("Can't open log file.\n"); /* Write data. */ @@ -2048,7 +2063,7 @@ static int read_log_test(char *mount_dir) for (i = 0; i < file_num; i++) { struct test_file *file = &test.files[i]; - if (validate_logs(mount_dir, log_fd, file)) + if (validate_logs(mount_dir, log_fd, file, false)) goto failure; } @@ -2061,7 +2076,7 @@ static int read_log_test(char *mount_dir) goto failure; } - if (mount_fs_opt(mount_dir, backing_dir, "readahead=0") != 0) + if (mount_fs_opt(mount_dir, backing_dir, "readahead=0", false) != 0) goto failure; cmd_fd = open_commands_file(mount_dir); @@ -2069,19 +2084,68 @@ static int read_log_test(char *mount_dir) goto failure; log_fd = open_log_file(mount_dir); - if (cmd_fd < 0) + if (log_fd < 0) ksft_print_msg("Can't open log file.\n"); /* Validate data again */ for (i = 0; i < file_num; i++) { struct test_file *file = &test.files[i]; - if (validate_logs(mount_dir, log_fd, file)) + if (validate_logs(mount_dir, log_fd, file, false)) + goto failure; + } + + /* + * Unmount and mount again with no read log to make sure poll + * doesn't crash + */ + close(cmd_fd); + close(log_fd); + if (umount(mount_dir) != 0) { + print_error("Can't unmout FS"); + goto failure; + } + + if (mount_fs_opt(mount_dir, backing_dir, "readahead=0,rlog_pages=0", + false) != 0) + goto failure; + + log_fd = open_log_file(mount_dir); + if (log_fd < 0) + ksft_print_msg("Can't open log file.\n"); + + /* Validate data again - note should fail this time */ + for (i = 0; i < file_num; i++) { + struct test_file *file = &test.files[i]; + + if (validate_logs(mount_dir, log_fd, file, true)) + goto failure; + } + + /* + * Remount and check that logs start working again + */ + drop_caches = open("/proc/sys/vm/drop_caches", O_WRONLY); + if (drop_caches == -1) + goto failure; + i = write(drop_caches, "3", 1); + close(drop_caches); + if (i != 1) + goto failure; + + if (mount_fs_opt(mount_dir, backing_dir, "readahead=0,rlog_pages=4", + true) != 0) + goto failure; + + /* Validate data again */ + for (i = 0; i < file_num; i++) { + struct test_file *file = &test.files[i]; + + if (validate_logs(mount_dir, log_fd, file, false)) goto failure; } /* Final unmount */ - close(cmd_fd); close(log_fd); free(backing_dir); if (umount(mount_dir) != 0) { @@ -2148,12 +2212,29 @@ static int validate_ranges(const char *mount_dir, struct test_file *file) int error = TEST_SUCCESS; int i; int range_cnt; + int cmd_fd = -1; + struct incfs_permit_fill permit_fill; fd = open(filename, O_RDONLY); free(filename); if (fd <= 0) return TEST_FAILURE; + error = ioctl(fd, INCFS_IOC_GET_FILLED_BLOCKS, &fba); + if (error != -1 || errno != EPERM) { + ksft_print_msg("INCFS_IOC_GET_FILLED_BLOCKS not blocked\n"); + error = -EPERM; + goto out; + } + + cmd_fd = open_commands_file(mount_dir); + permit_fill.file_descriptor = fd; + if (ioctl(cmd_fd, INCFS_IOC_PERMIT_FILL, &permit_fill)) { + print_error("INCFS_IOC_PERMIT_FILL failed"); + return -EPERM; + goto out; + } + error = ioctl(fd, INCFS_IOC_GET_FILLED_BLOCKS, &fba); if (error && errno != ERANGE) goto out; @@ -2171,6 +2252,11 @@ static int validate_ranges(const char *mount_dir, struct test_file *file) goto out; } + if (fba.data_blocks_out != block_cnt) { + error = -EINVAL; + goto out; + } + range_cnt = (block_cnt + 3) / 4; if (range_cnt > 128) range_cnt = 128; @@ -2241,6 +2327,7 @@ static int validate_ranges(const char *mount_dir, struct test_file *file) out: close(fd); + close(cmd_fd); return error; } @@ -2256,7 +2343,7 @@ static int get_blocks_test(char *mount_dir) if (!backing_dir) goto failure; - if (mount_fs_opt(mount_dir, backing_dir, "readahead=0") != 0) + if (mount_fs_opt(mount_dir, backing_dir, "readahead=0", false) != 0) goto failure; cmd_fd = open_commands_file(mount_dir); @@ -2351,6 +2438,7 @@ failure: static int validate_hash_ranges(const char *mount_dir, struct test_file *file) { + int block_cnt = 1 + (file->size - 1) / INCFS_DATA_FILE_BLOCK_SIZE; char *filename = concat_file_name(mount_dir, file->name); int fd; struct incfs_filled_range ranges[128]; @@ -2361,6 +2449,8 @@ static int validate_hash_ranges(const char *mount_dir, struct test_file *file) int error = TEST_SUCCESS; int file_blocks = (file->size + INCFS_DATA_FILE_BLOCK_SIZE - 1) / INCFS_DATA_FILE_BLOCK_SIZE; + int cmd_fd = -1; + struct incfs_permit_fill permit_fill; if (file->size <= 4096 / 32 * 4096) return 0; @@ -2370,10 +2460,35 @@ static int validate_hash_ranges(const char *mount_dir, struct test_file *file) if (fd <= 0) return TEST_FAILURE; + error = ioctl(fd, INCFS_IOC_GET_FILLED_BLOCKS, &fba); + if (error != -1 || errno != EPERM) { + ksft_print_msg("INCFS_IOC_GET_FILLED_BLOCKS not blocked\n"); + error = -EPERM; + goto out; + } + + cmd_fd = open_commands_file(mount_dir); + permit_fill.file_descriptor = fd; + if (ioctl(cmd_fd, INCFS_IOC_PERMIT_FILL, &permit_fill)) { + print_error("INCFS_IOC_PERMIT_FILL failed"); + return -EPERM; + goto out; + } + error = ioctl(fd, INCFS_IOC_GET_FILLED_BLOCKS, &fba); if (error) goto out; + if (fba.total_blocks_out <= block_cnt) { + error = -EINVAL; + goto out; + } + + if (fba.data_blocks_out != block_cnt) { + error = -EINVAL; + goto out; + } + if (fba.range_buffer_size_out != sizeof(struct incfs_filled_range)) { error = -EINVAL; goto out; @@ -2386,6 +2501,7 @@ static int validate_hash_ranges(const char *mount_dir, struct test_file *file) } out: + close(cmd_fd); close(fd); return error; } @@ -2402,7 +2518,7 @@ static int get_hash_blocks_test(char *mount_dir) if (!backing_dir) goto failure; - if (mount_fs_opt(mount_dir, backing_dir, "readahead=0") != 0) + if (mount_fs_opt(mount_dir, backing_dir, "readahead=0", false) != 0) goto failure; cmd_fd = open_commands_file(mount_dir); diff --git a/tools/testing/selftests/filesystems/incfs/utils.c b/tools/testing/selftests/filesystems/incfs/utils.c index 3a72fa5d5e9a..545497685d14 100644 --- a/tools/testing/selftests/filesystems/incfs/utils.c +++ b/tools/testing/selftests/filesystems/incfs/utils.c @@ -41,12 +41,13 @@ int mount_fs(const char *mount_dir, const char *backing_dir, } int mount_fs_opt(const char *mount_dir, const char *backing_dir, - const char *opt) + const char *opt, bool remount) { static const char fs_name[] = INCFS_NAME; int result; - result = mount(backing_dir, mount_dir, fs_name, 0, opt); + result = mount(backing_dir, mount_dir, fs_name, + remount ? MS_REMOUNT : 0, opt); if (result != 0) perror("Error mounting fs."); return result; diff --git a/tools/testing/selftests/filesystems/incfs/utils.h b/tools/testing/selftests/filesystems/incfs/utils.h index 23c8a099662a..24b43287fcdd 100644 --- a/tools/testing/selftests/filesystems/incfs/utils.h +++ b/tools/testing/selftests/filesystems/incfs/utils.h @@ -23,7 +23,7 @@ int mount_fs(const char *mount_dir, const char *backing_dir, int read_timeout_ms); int mount_fs_opt(const char *mount_dir, const char *backing_dir, - const char *opt); + const char *opt, bool remount); int get_file_bmap(int cmd_fd, int ino, unsigned char *buf, int buf_size); diff --git a/usr/Kconfig b/usr/Kconfig index a6b68503d177..a80cc7972274 100644 --- a/usr/Kconfig +++ b/usr/Kconfig @@ -131,17 +131,6 @@ choice If in doubt, select 'None' -config INITRAMFS_COMPRESSION_NONE - bool "None" - help - Do not compress the built-in initramfs at all. This may sound wasteful - in space, but, you should be aware that the built-in initramfs will be - compressed at a later stage anyways along with the rest of the kernel, - on those architectures that support this. However, not compressing the - initramfs may lead to slightly higher memory consumption during a - short time at boot, while both the cpio image and the unpacked - filesystem image will be present in memory simultaneously - config INITRAMFS_COMPRESSION_GZIP bool "Gzip" depends on RD_GZIP @@ -214,6 +203,17 @@ config INITRAMFS_COMPRESSION_LZ4 If you choose this, keep in mind that most distros don't provide lz4 by default which could cause a build failure. +config INITRAMFS_COMPRESSION_NONE + bool "None" + help + Do not compress the built-in initramfs at all. This may sound wasteful + in space, but, you should be aware that the built-in initramfs will be + compressed at a later stage anyways along with the rest of the kernel, + on those architectures that support this. However, not compressing the + initramfs may lead to slightly higher memory consumption during a + short time at boot, while both the cpio image and the unpacked + filesystem image will be present in memory simultaneously + endchoice config INITRAMFS_COMPRESSION