Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 1 | // |
Jan Monsch | cd7c913 | 2020-05-08 02:34:40 +0200 | [diff] [blame] | 2 | // Copyright (C) 2017-2020 The Android Open Source Project |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 3 | // |
| 4 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | // you may not use this file except in compliance with the License. |
| 6 | // You may obtain a copy of the License at |
| 7 | // |
| 8 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | // |
| 10 | // Unless required by applicable law or agreed to in writing, software |
| 11 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | // See the License for the specific language governing permissions and |
| 14 | // limitations under the License. |
| 15 | // |
| 16 | |
Bob Badour | b30c971 | 2021-02-12 14:49:55 -0800 | [diff] [blame] | 17 | package { |
| 18 | default_applicable_licenses: ["external_avb_license"], |
| 19 | } |
| 20 | |
| 21 | // Added automatically by a large-scale-change that took the approach of |
| 22 | // 'apply every license found to every target'. While this makes sure we respect |
| 23 | // every license restriction, it may not be entirely correct. |
| 24 | // |
| 25 | // e.g. GPL in an MIT project might only apply to the contrib/ directory. |
| 26 | // |
| 27 | // Please consider splitting the single license below into multiple licenses, |
| 28 | // taking care not to lose any license_kind information, and overriding the |
| 29 | // default license using the 'licenses: [...]' property on targets as needed. |
| 30 | // |
| 31 | // For unused files, consider creating a 'fileGroup' with "//visibility:private" |
| 32 | // to attach the license to, and including a comment whether the files may be |
| 33 | // used in the current project. |
| 34 | // See: http://go/android-license-faq |
| 35 | license { |
| 36 | name: "external_avb_license", |
| 37 | visibility: [":__subpackages__"], |
| 38 | license_kinds: [ |
| 39 | "SPDX-license-identifier-Apache-2.0", |
| 40 | "SPDX-license-identifier-BSD", |
| 41 | "SPDX-license-identifier-MIT", |
| 42 | ], |
| 43 | license_text: [ |
| 44 | "LICENSE", |
| 45 | ], |
| 46 | } |
| 47 | |
ThiƩbaud Weksteen | 23dbe6e | 2020-05-15 15:52:02 +0200 | [diff] [blame] | 48 | subdirs = [ |
| 49 | "test", |
| 50 | "tools", |
| 51 | ] |
Bryan Henry | 99df6c8 | 2018-10-25 15:00:43 -0700 | [diff] [blame] | 52 | |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 53 | cc_defaults { |
| 54 | name: "avb_defaults", |
| 55 | cflags: [ |
| 56 | "-D_FILE_OFFSET_BITS=64", |
| 57 | "-D_POSIX_C_SOURCE=199309L", |
| 58 | "-Wa,--noexecstack", |
| 59 | "-Werror", |
| 60 | "-Wall", |
| 61 | "-Wextra", |
| 62 | "-Wformat=2", |
David Zeuthen | 047ecf7 | 2017-06-28 14:10:55 -0400 | [diff] [blame] | 63 | "-Wmissing-prototypes", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 64 | "-Wno-psabi", |
| 65 | "-Wno-unused-parameter", |
Yi Kong | ed46d64 | 2018-01-03 11:52:56 -0800 | [diff] [blame] | 66 | "-Wno-format", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 67 | "-ffunction-sections", |
| 68 | "-fstack-protector-strong", |
| 69 | "-g", |
| 70 | "-DAVB_ENABLE_DEBUG", |
| 71 | "-DAVB_COMPILATION", |
| 72 | ], |
| 73 | cppflags: [ |
| 74 | "-Wnon-virtual-dtor", |
| 75 | "-fno-strict-aliasing", |
| 76 | ], |
| 77 | ldflags: [ |
| 78 | "-Wl,--gc-sections", |
| 79 | "-rdynamic", |
| 80 | ], |
| 81 | target: { |
| 82 | darwin: { |
| 83 | enabled: false, |
| 84 | }, |
| 85 | }, |
| 86 | } |
| 87 | |
| 88 | cc_defaults { |
| 89 | name: "avb_sources", |
| 90 | srcs: [ |
| 91 | "libavb/avb_chain_partition_descriptor.c", |
Lonnie Liu | 97740e5 | 2017-11-09 11:16:15 -0800 | [diff] [blame] | 92 | "libavb/avb_cmdline.c", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 93 | "libavb/avb_crc32.c", |
| 94 | "libavb/avb_crypto.c", |
| 95 | "libavb/avb_descriptor.c", |
| 96 | "libavb/avb_footer.c", |
| 97 | "libavb/avb_hash_descriptor.c", |
| 98 | "libavb/avb_hashtree_descriptor.c", |
| 99 | "libavb/avb_kernel_cmdline_descriptor.c", |
| 100 | "libavb/avb_property_descriptor.c", |
| 101 | "libavb/avb_rsa.c", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 102 | "libavb/avb_slot_verify.c", |
| 103 | "libavb/avb_util.c", |
| 104 | "libavb/avb_vbmeta_image.c", |
| 105 | "libavb/avb_version.c", |
| 106 | ], |
| 107 | } |
| 108 | |
Andrew Scull | 725bff4 | 2021-04-29 20:39:42 +0000 | [diff] [blame] | 109 | cc_defaults { |
| 110 | name: "avb_crypto_ops_impl_boringssl", |
| 111 | srcs: [ |
| 112 | "libavb/boringssl/sha.c", |
| 113 | ], |
| 114 | local_include_dirs: [ |
| 115 | "libavb/boringssl", |
| 116 | ], |
| 117 | shared_libs: [ |
| 118 | "libcrypto", |
| 119 | ], |
| 120 | } |
| 121 | |
| 122 | cc_defaults { |
| 123 | name: "avb_crypto_ops_impl_sha", |
| 124 | srcs: [ |
| 125 | "libavb/sha/sha256_impl.c", |
| 126 | "libavb/sha/sha512_impl.c", |
| 127 | ], |
| 128 | local_include_dirs: [ |
| 129 | "libavb/sha", |
| 130 | ], |
| 131 | } |
| 132 | |
Alex Light | 027718c | 2019-03-07 16:44:46 -0800 | [diff] [blame] | 133 | python_binary_host { |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 134 | name: "avbtool", |
Jan Monsch | a18b2ec | 2020-04-22 11:43:35 +0200 | [diff] [blame] | 135 | srcs: ["avbtool.py"], |
Alex Light | 027718c | 2019-03-07 16:44:46 -0800 | [diff] [blame] | 136 | main: "avbtool.py", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 137 | required: ["fec"], |
Alex Light | 027718c | 2019-03-07 16:44:46 -0800 | [diff] [blame] | 138 | version: { |
| 139 | py2: { |
Jan Monsch | 13efb5f | 2020-04-22 17:34:24 +0200 | [diff] [blame] | 140 | enabled: false, |
Alex Light | 027718c | 2019-03-07 16:44:46 -0800 | [diff] [blame] | 141 | }, |
| 142 | py3: { |
Jan Monsch | 13efb5f | 2020-04-22 17:34:24 +0200 | [diff] [blame] | 143 | enabled: true, |
Bowgo Tsai | e4c67ec | 2021-01-28 13:29:01 +0800 | [diff] [blame] | 144 | embedded_launcher: true, |
Julien Desprez | 0d584b6 | 2021-01-15 17:56:56 -0800 | [diff] [blame] | 145 | }, |
| 146 | }, |
Julien Desprez | 809d269 | 2021-01-27 14:07:27 -0800 | [diff] [blame] | 147 | compile_multilib: "first", |
Alex Light | 027718c | 2019-03-07 16:44:46 -0800 | [diff] [blame] | 148 | } |
| 149 | |
Andrew Scull | 2787f22 | 2022-01-11 17:48:22 +0000 | [diff] [blame] | 150 | // Build libavb - this is a static library that depends |
| 151 | // on only libc and libcrypto, but no other dependencies. |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 152 | cc_library_static { |
| 153 | name: "libavb", |
| 154 | defaults: [ |
| 155 | "avb_defaults", |
| 156 | "avb_sources", |
Andrew Scull | 725bff4 | 2021-04-29 20:39:42 +0000 | [diff] [blame] | 157 | "avb_crypto_ops_impl_boringssl", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 158 | ], |
| 159 | host_supported: true, |
Inseob Kim | f1bca77 | 2021-06-14 11:53:04 +0900 | [diff] [blame] | 160 | ramdisk_available: true, |
David Anderson | ddab37d | 2021-07-23 16:51:13 -0700 | [diff] [blame] | 161 | vendor_ramdisk_available: true, |
Jiyong Park | 44e0712 | 2018-05-24 14:07:34 +0900 | [diff] [blame] | 162 | recovery_available: true, |
Chin-Ting Kuo | 3cf5c72 | 2019-09-16 11:38:01 +0800 | [diff] [blame] | 163 | header_libs: [ |
| 164 | "avb_headers", |
| 165 | ], |
| 166 | export_header_lib_headers: ["avb_headers"], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 167 | target: { |
Andreas Gampe | 364a342 | 2018-12-26 11:12:11 -0800 | [diff] [blame] | 168 | linux: { |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 169 | srcs: ["libavb/avb_sysdeps_posix.c"], |
| 170 | }, |
Dan Willemsen | 34ec123 | 2017-10-02 10:41:07 -0700 | [diff] [blame] | 171 | linux_glibc: { |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 172 | cflags: ["-fno-stack-protector"], |
| 173 | }, |
| 174 | }, |
| 175 | } |
| 176 | |
| 177 | // Build libavb_user for the target - in addition to libavb, it |
| 178 | // includes libavb_ab, libavb_user and also depends on libbase and |
| 179 | // libfs_mgr. |
| 180 | cc_library_static { |
| 181 | name: "libavb_user", |
| 182 | defaults: [ |
| 183 | "avb_defaults", |
| 184 | "avb_sources", |
Andrew Scull | 725bff4 | 2021-04-29 20:39:42 +0000 | [diff] [blame] | 185 | "avb_crypto_ops_impl_boringssl", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 186 | ], |
Jiyong Park | 44e0712 | 2018-05-24 14:07:34 +0900 | [diff] [blame] | 187 | recovery_available: true, |
Chin-Ting Kuo | 3cf5c72 | 2019-09-16 11:38:01 +0800 | [diff] [blame] | 188 | header_libs: [ |
| 189 | "avb_headers", |
| 190 | ], |
| 191 | export_header_lib_headers: ["avb_headers"], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 192 | shared_libs: ["libbase"], |
| 193 | static_libs: ["libfs_mgr"], |
David Zeuthen | 37f5946 | 2017-09-20 15:02:32 -0400 | [diff] [blame] | 194 | cflags: [ |
| 195 | "-DAVB_AB_I_UNDERSTAND_LIBAVB_AB_IS_DEPRECATED", |
| 196 | ], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 197 | srcs: [ |
| 198 | "libavb/avb_sysdeps_posix.c", |
| 199 | "libavb_ab/avb_ab_flow.c", |
Bowgo Tsai | 84c610e | 2017-09-28 15:13:05 +0800 | [diff] [blame] | 200 | "libavb_user/avb_ops_user.cpp", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 201 | "libavb_user/avb_user_verity.c", |
David Zeuthen | 0922bf8 | 2017-06-19 17:50:38 -0400 | [diff] [blame] | 202 | "libavb_user/avb_user_verification.c", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 203 | ], |
| 204 | } |
| 205 | |
| 206 | cc_binary { |
| 207 | name: "avbctl", |
| 208 | defaults: ["avb_defaults"], |
| 209 | static_libs: [ |
| 210 | "libavb_user", |
| 211 | "libfs_mgr", |
| 212 | ], |
Andrew Scull | 725bff4 | 2021-04-29 20:39:42 +0000 | [diff] [blame] | 213 | shared_libs: [ |
| 214 | "libbase", |
| 215 | "libcrypto", |
| 216 | ], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 217 | srcs: ["tools/avbctl/avbctl.cc"], |
| 218 | } |
| 219 | |
| 220 | cc_library_host_static { |
| 221 | name: "libavb_ab_host", |
| 222 | defaults: ["avb_defaults"], |
Chin-Ting Kuo | 3cf5c72 | 2019-09-16 11:38:01 +0800 | [diff] [blame] | 223 | header_libs: [ |
| 224 | "avb_headers", |
| 225 | ], |
| 226 | export_header_lib_headers: ["avb_headers"], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 227 | cflags: [ |
| 228 | "-fno-stack-protector", |
David Zeuthen | 37f5946 | 2017-09-20 15:02:32 -0400 | [diff] [blame] | 229 | "-DAVB_AB_I_UNDERSTAND_LIBAVB_AB_IS_DEPRECATED", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 230 | ], |
| 231 | srcs: ["libavb_ab/avb_ab_flow.c"], |
| 232 | } |
| 233 | |
Andrew Scull | 2787f22 | 2022-01-11 17:48:22 +0000 | [diff] [blame] | 234 | cc_defaults { |
| 235 | name: "avb_atx_sources", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 236 | srcs: ["libavb_atx/avb_atx_validate.c"], |
| 237 | } |
| 238 | |
| 239 | cc_library_host_static { |
| 240 | name: "libavb_host_sysdeps", |
| 241 | defaults: ["avb_defaults"], |
Chin-Ting Kuo | 3cf5c72 | 2019-09-16 11:38:01 +0800 | [diff] [blame] | 242 | header_libs: [ |
| 243 | "avb_headers", |
| 244 | ], |
| 245 | export_header_lib_headers: ["avb_headers"], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 246 | srcs: ["libavb/avb_sysdeps_posix.c"], |
| 247 | } |
| 248 | |
Andrew Scull | 2787f22 | 2022-01-11 17:48:22 +0000 | [diff] [blame] | 249 | cc_defaults { |
| 250 | name: "avb_things_example_sources", |
Darren Krahn | 8160f36 | 2017-10-05 22:11:02 -0700 | [diff] [blame] | 251 | srcs: ["examples/things/avb_atx_slot_verify.c"], |
| 252 | } |
| 253 | |
Andrew Scull | 725bff4 | 2021-04-29 20:39:42 +0000 | [diff] [blame] | 254 | cc_defaults { |
| 255 | name: "libavb_host_unittest_core", |
Andrew Scull | 2787f22 | 2022-01-11 17:48:22 +0000 | [diff] [blame] | 256 | defaults: [ |
| 257 | "avb_defaults", |
| 258 | "avb_sources", |
| 259 | "avb_atx_sources", |
| 260 | "avb_things_example_sources", |
| 261 | ], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 262 | required: [ |
| 263 | "simg2img", |
| 264 | "img2simg", |
| 265 | "avbtool", |
| 266 | ], |
Julien Desprez | 15e81d9 | 2021-01-21 11:29:14 -0800 | [diff] [blame] | 267 | test_options: { |
| 268 | unit_test: true, |
| 269 | }, |
| 270 | compile_multilib: "first", |
Bryan Henry | b24af10 | 2018-10-25 18:20:23 -0700 | [diff] [blame] | 271 | data: [ |
| 272 | "avbtool", |
Jan Monsch | cd7c913 | 2020-05-08 02:34:40 +0200 | [diff] [blame] | 273 | "test/avbtool_signing_helper_test.py", |
| 274 | "test/avbtool_signing_helper_with_files_test.py", |
Bryan Henry | b24af10 | 2018-10-25 18:20:23 -0700 | [diff] [blame] | 275 | "test/data/*", |
| 276 | ], |
| 277 | test_config: "test/libavb_host_unittest.xml", |
Bryan Henry | d7156cd | 2019-01-24 16:32:52 -0800 | [diff] [blame] | 278 | test_suites: ["general-tests"], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 279 | static_libs: [ |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 280 | "libavb_ab_host", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 281 | "libgmock_host", |
| 282 | "libgtest_host", |
| 283 | ], |
| 284 | shared_libs: [ |
Bryan Henry | 573bb4c | 2018-12-01 11:42:18 -0800 | [diff] [blame] | 285 | "libbase", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 286 | "libchrome", |
| 287 | "libcrypto", |
| 288 | ], |
David Zeuthen | 047ecf7 | 2017-06-28 14:10:55 -0400 | [diff] [blame] | 289 | cflags: [ |
ThiƩbaud Weksteen | 23dbe6e | 2020-05-15 15:52:02 +0200 | [diff] [blame] | 290 | "-Wno-missing-prototypes", |
| 291 | "-DAVB_AB_I_UNDERSTAND_LIBAVB_AB_IS_DEPRECATED", |
David Zeuthen | 047ecf7 | 2017-06-28 14:10:55 -0400 | [diff] [blame] | 292 | ], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 293 | srcs: [ |
| 294 | "test/avb_ab_flow_unittest.cc", |
| 295 | "test/avb_atx_validate_unittest.cc", |
Darren Krahn | 8160f36 | 2017-10-05 22:11:02 -0700 | [diff] [blame] | 296 | "test/avb_atx_slot_verify_unittest.cc", |
Andrew Scull | 725bff4 | 2021-04-29 20:39:42 +0000 | [diff] [blame] | 297 | "test/avb_crypto_ops_unittest.cc", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 298 | "test/avb_slot_verify_unittest.cc", |
| 299 | "test/avb_unittest_util.cc", |
| 300 | "test/avb_util_unittest.cc", |
| 301 | "test/avb_vbmeta_image_unittest.cc", |
| 302 | "test/avbtool_unittest.cc", |
| 303 | "test/fake_avb_ops.cc", |
| 304 | "test/avb_sysdeps_posix_testing.cc", |
| 305 | ], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 306 | } |
| 307 | |
Andrew Scull | 725bff4 | 2021-04-29 20:39:42 +0000 | [diff] [blame] | 308 | cc_test_host { |
| 309 | name: "libavb_host_unittest", |
| 310 | defaults: [ |
| 311 | "avb_crypto_ops_impl_boringssl", |
| 312 | "libavb_host_unittest_core", |
| 313 | ], |
| 314 | data: [ |
| 315 | ":img2simg", |
| 316 | ":simg2img", |
| 317 | ":fec", |
| 318 | ], |
| 319 | } |
| 320 | |
| 321 | cc_test_host { |
| 322 | name: "libavb_host_unittest_sha", |
| 323 | defaults: [ |
| 324 | "avb_crypto_ops_impl_sha", |
| 325 | "libavb_host_unittest_core", |
| 326 | ], |
| 327 | data: [ |
| 328 | ":img2simg", |
| 329 | ":simg2img", |
| 330 | ":fec", |
| 331 | ], |
| 332 | } |
| 333 | |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 334 | cc_library_host_static { |
| 335 | name: "libavb_host_user_code_test", |
| 336 | defaults: ["avb_defaults"], |
David Zeuthen | 37f5946 | 2017-09-20 15:02:32 -0400 | [diff] [blame] | 337 | cflags: [ |
| 338 | "-DAVB_AB_I_UNDERSTAND_LIBAVB_AB_IS_DEPRECATED", |
| 339 | ], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 340 | srcs: ["test/user_code_test.cc"], |
| 341 | } |
| 342 | |
| 343 | cc_library { |
| 344 | name: "bootctrl.avb", |
| 345 | defaults: ["avb_defaults"], |
| 346 | relative_install_path: "hw", |
| 347 | static_libs: [ |
| 348 | "libavb_user", |
| 349 | "libfs_mgr", |
| 350 | ], |
| 351 | shared_libs: [ |
| 352 | "libbase", |
Andrew Scull | 725bff4 | 2021-04-29 20:39:42 +0000 | [diff] [blame] | 353 | "libcrypto", |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 354 | "libcutils", |
| 355 | ], |
David Zeuthen | 37f5946 | 2017-09-20 15:02:32 -0400 | [diff] [blame] | 356 | cflags: [ |
| 357 | "-DAVB_AB_I_UNDERSTAND_LIBAVB_AB_IS_DEPRECATED", |
| 358 | ], |
Tom Cherry | 8d225d8 | 2017-05-12 17:00:31 -0700 | [diff] [blame] | 359 | srcs: ["boot_control/boot_control_avb.c"], |
| 360 | } |
Chin-Ting Kuo | 3cf5c72 | 2019-09-16 11:38:01 +0800 | [diff] [blame] | 361 | |
| 362 | cc_library_headers { |
| 363 | name: "avb_headers", |
| 364 | host_supported: true, |
Inseob Kim | f1bca77 | 2021-06-14 11:53:04 +0900 | [diff] [blame] | 365 | ramdisk_available: true, |
David Anderson | ddab37d | 2021-07-23 16:51:13 -0700 | [diff] [blame] | 366 | vendor_ramdisk_available: true, |
Chin-Ting Kuo | 3cf5c72 | 2019-09-16 11:38:01 +0800 | [diff] [blame] | 367 | recovery_available: true, |
| 368 | export_include_dirs: ["."], |
| 369 | target: { |
| 370 | windows: { |
| 371 | enabled: true, |
| 372 | }, |
| 373 | }, |
| 374 | } |