blob: 0f0a7701a4a19d94b6534fee1c82e10a8f9d8626 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001#
2# Copyright (C) 2015 The Android Open Source Project
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#
Alex Deymo719bfff2014-07-11 12:12:32 -070016{
17 'target_defaults': {
18 'variables': {
19 'deps': [
20 'libchrome-<(libbase_ver)',
21 'libchromeos-<(libbase_ver)',
22 ],
23 # Defaults if the -DUSE_* flags are not passed to gyp is 0. You can set
24 # the default value for the USE flag in the ebuild.
25 'USE_hwid_override%': '0',
26 'USE_power_management%': '0',
27 },
28 'cflags': [
29 '-g',
30 '-ffunction-sections',
31 '-Wall',
32 '-Wextra',
33 '-Werror',
34 '-Wno-unused-parameter',
35 '-Wno-deprecated-register',
36 ],
37 'cflags_cc': [
38 '-fno-strict-aliasing',
Nam T. Nguyenfc144e62014-12-03 09:50:49 -080039 '-Wnon-virtual-dtor',
Alex Deymo719bfff2014-07-11 12:12:32 -070040 ],
41 'ldflags': [
42 '-Wl,--gc-sections',
43 ],
44 'defines': [
Alex Deymo6f20dd42015-08-18 16:42:46 -070045 '_FILE_OFFSET_BITS=64',
Alex Deymo719bfff2014-07-11 12:12:32 -070046 '_POSIX_C_SOURCE=199309L',
47 'USE_HWID_OVERRIDE=<(USE_hwid_override)',
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -080048 'USE_MTD=<(USE_mtd)',
Alex Deymo719bfff2014-07-11 12:12:32 -070049 'USE_POWER_MANAGEMENT=<(USE_power_management)',
50 ],
Alex Deymoa7a34d82015-08-24 20:47:01 -070051 'include_dirs': [
52 # We need this include dir because we include all the local code as
53 # "update_engine/...".
54 '<(platform2_root)/../aosp/system',
55 ],
Alex Deymo719bfff2014-07-11 12:12:32 -070056 },
57 'targets': [
58 # Protobufs.
59 {
60 'target_name': 'update_metadata-protos',
61 'type': 'static_library',
62 'variables': {
63 'proto_in_dir': '.',
64 'proto_out_dir': 'include/update_engine',
Alex Deymo7504e5f2014-07-15 17:58:51 -070065 'exported_deps': [
Alex Deymob8f16a12014-06-10 18:59:22 -070066 'protobuf-lite',
Alex Deymo7504e5f2014-07-15 17:58:51 -070067 ],
68 'deps': ['<@(exported_deps)'],
69 },
70 'all_dependent_settings': {
71 'variables': {
72 'deps': [
73 '<@(exported_deps)',
74 ],
75 },
Alex Deymo719bfff2014-07-11 12:12:32 -070076 },
77 'sources': [
78 'update_metadata.proto'
79 ],
Alex Deymoa7a34d82015-08-24 20:47:01 -070080 'includes': ['../../../platform2/common-mk/protoc.gypi'],
Alex Deymo719bfff2014-07-11 12:12:32 -070081 },
Alex Deymob7ca0962014-10-01 17:58:07 -070082 # Chrome D-Bus bindings.
Alex Deymo719bfff2014-07-11 12:12:32 -070083 {
Alex Deymob7ca0962014-10-01 17:58:07 -070084 'target_name': 'update_engine-dbus-adaptor',
Alex Deymo719bfff2014-07-11 12:12:32 -070085 'type': 'none',
86 'variables': {
Alex Deymo6f20dd42015-08-18 16:42:46 -070087 'dbus_adaptors_out_dir': 'include/dbus_bindings',
Alex Deymo8a7d0ca2015-08-25 17:30:27 -070088 'dbus_xml_extension': 'dbus-xml',
Alex Deymo719bfff2014-07-11 12:12:32 -070089 },
90 'sources': [
Alex Deymo8a7d0ca2015-08-25 17:30:27 -070091 'dbus_bindings/org.chromium.UpdateEngineInterface.dbus-xml',
Alex Deymo719bfff2014-07-11 12:12:32 -070092 ],
Alex Deymoa7a34d82015-08-24 20:47:01 -070093 'includes': ['../../../platform2/common-mk/generate-dbus-adaptors.gypi'],
Alex Deymo719bfff2014-07-11 12:12:32 -070094 },
Alex Deymof7feb232015-08-14 10:54:02 -070095 {
Alex Deymob8803bb2015-08-19 23:14:49 -070096 'target_name': 'update_engine-other-dbus-proxies',
Alex Deymof7feb232015-08-14 10:54:02 -070097 'type': 'none',
98 'actions': [
99 {
Alex Deymob8803bb2015-08-19 23:14:49 -0700100 'action_name': 'update_engine-dbus-libcros-client',
101 'variables': {
102 'mock_output_file': 'include/libcros/dbus-proxy-mocks.h',
103 'proxy_output_file': 'include/libcros/dbus-proxies.h'
104 },
105 'sources': [
Alex Deymo6f20dd42015-08-18 16:42:46 -0700106 'dbus_bindings/org.chromium.LibCrosService.dbus-xml',
Alex Deymof7feb232015-08-14 10:54:02 -0700107 ],
Alex Deymoa7a34d82015-08-24 20:47:01 -0700108 'includes': ['../../../platform2/common-mk/generate-dbus-proxies.gypi'],
Alex Deymof7feb232015-08-14 10:54:02 -0700109 },
110 ],
111 },
Alex Deymo719bfff2014-07-11 12:12:32 -0700112 # The main static_library with all the code.
113 {
114 'target_name': 'libupdate_engine',
115 'type': 'static_library',
116 'dependencies': [
117 'update_metadata-protos',
Alex Deymo30534502015-07-20 15:06:33 -0700118 'update_engine-dbus-adaptor',
Alex Deymob8803bb2015-08-19 23:14:49 -0700119 'update_engine-other-dbus-proxies',
Alex Deymo719bfff2014-07-11 12:12:32 -0700120 ],
121 'variables': {
122 'exported_deps': [
123 'dbus-1',
Alex Deymo719bfff2014-07-11 12:12:32 -0700124 'libcrypto',
125 'libcurl',
Alex Deymod6deb1d2015-08-28 15:54:37 -0700126 'libdebugd-client',
127 'libsession_manager-client',
Alex Deymo719bfff2014-07-11 12:12:32 -0700128 'libmetrics-<(libbase_ver)',
Alex Deymod6deb1d2015-08-28 15:54:37 -0700129 'libpower_manager-client',
130 'libupdate_engine-client',
131 'libshill-client',
Alex Deymo719bfff2014-07-11 12:12:32 -0700132 'libssl',
Alex Deymod6deb1d2015-08-28 15:54:37 -0700133 'expat',
Alex Deymo719bfff2014-07-11 12:12:32 -0700134 ],
135 'deps': ['<@(exported_deps)'],
136 },
137 'all_dependent_settings': {
138 'variables': {
139 'deps': [
140 '<@(exported_deps)',
141 ],
142 },
143 },
144 'link_settings': {
145 'variables': {
146 'deps': [
147 '<@(exported_deps)',
148 ],
149 },
150 'libraries': [
151 '-lbz2',
Alex Deymo719bfff2014-07-11 12:12:32 -0700152 '-lpolicy-<(libbase_ver)',
153 '-lrootdev',
154 '-lrt',
155 '-lvboot_host',
156 ],
157 },
158 'sources': [
159 'action_processor.cc',
Alex Deymo763e7db2015-08-27 21:08:08 -0700160 'boot_control_chromeos.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700161 'bzip.cc',
162 'bzip_extent_writer.cc',
163 'certificate_checker.cc',
164 'chrome_browser_proxy_resolver.cc',
165 'clock.cc',
166 'connection_manager.cc',
167 'constants.cc',
Alex Deymob7ca0962014-10-01 17:58:07 -0700168 'daemon.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700169 'dbus_service.cc',
170 'delta_performer.cc',
171 'download_action.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700172 'extent_writer.cc',
173 'file_descriptor.cc',
174 'file_writer.cc',
Allie Woodeb9e6d82015-04-17 13:55:30 -0700175 'filesystem_verifier_action.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700176 'hardware.cc',
177 'http_common.cc',
178 'http_fetcher.cc',
179 'hwid_override.cc',
180 'install_plan.cc',
Alex Deymo30534502015-07-20 15:06:33 -0700181 'libcros_proxy.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700182 'libcurl_http_fetcher.cc',
183 'metrics.cc',
184 'multi_range_http_fetcher.cc',
185 'omaha_hash_calculator.cc',
186 'omaha_request_action.cc',
187 'omaha_request_params.cc',
188 'omaha_response_handler_action.cc',
189 'p2p_manager.cc',
190 'payload_constants.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700191 'payload_state.cc',
Alex Deymo923d8fa2014-07-15 17:58:51 -0700192 'payload_verifier.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700193 'postinstall_runner_action.cc',
194 'prefs.cc',
195 'proxy_resolver.cc',
196 'real_system_state.cc',
Alex Deymo30534502015-07-20 15:06:33 -0700197 'shill_proxy.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700198 'subprocess.cc',
199 'terminator.cc',
200 'update_attempter.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700201 'update_manager/boxed_value.cc',
202 'update_manager/chromeos_policy.cc',
Gilad Arnolda23e4082014-07-17 11:40:43 -0700203 'update_manager/default_policy.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700204 'update_manager/evaluation_context.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700205 'update_manager/policy.cc',
206 'update_manager/real_config_provider.cc',
207 'update_manager/real_device_policy_provider.cc',
208 'update_manager/real_random_provider.cc',
209 'update_manager/real_shill_provider.cc',
210 'update_manager/real_system_provider.cc',
211 'update_manager/real_time_provider.cc',
212 'update_manager/real_updater_provider.cc',
213 'update_manager/state_factory.cc',
214 'update_manager/update_manager.cc',
215 'utils.cc',
216 ],
Nam T. Nguyenf1d582e2014-12-08 15:07:17 -0800217 'conditions': [
218 ['USE_mtd == 1', {
219 'sources': [
220 'mtd_file_descriptor.cc',
221 ],
222 'link_settings': {
223 'libraries': [
224 '-lmtdutils',
225 ],
226 },
227 }],
228 ],
Alex Deymo719bfff2014-07-11 12:12:32 -0700229 },
230 # update_engine daemon.
231 {
232 'target_name': 'update_engine',
233 'type': 'executable',
Alex Deymo44666f92014-07-22 20:29:24 -0700234 'dependencies': [
235 'libupdate_engine',
Alex Deymo44666f92014-07-22 20:29:24 -0700236 ],
Alex Deymo719bfff2014-07-11 12:12:32 -0700237 'sources': [
238 'main.cc',
239 ]
240 },
241 # update_engine console client.
242 {
243 'target_name': 'update_engine_client',
244 'type': 'executable',
Alex Deymo44666f92014-07-22 20:29:24 -0700245 'variables': {
246 'exported_deps': [
Alex Deymod6deb1d2015-08-28 15:54:37 -0700247 'libupdate_engine-client',
Alex Deymo44666f92014-07-22 20:29:24 -0700248 ],
249 'deps': ['<@(exported_deps)'],
250 },
Alex Deymo719bfff2014-07-11 12:12:32 -0700251 'sources': [
252 'update_engine_client.cc',
Alex Deymo72aa0022015-06-19 21:16:49 -0700253 ],
Alex Deymod2956cc2015-08-17 15:39:40 -0700254 },
Alex Deymo7504e5f2014-07-15 17:58:51 -0700255 # server-side code. This is used for delta_generator and unittests but not
256 # for any client code.
257 {
258 'target_name': 'libpayload_generator',
259 'type': 'static_library',
260 'dependencies': [
Alex Deymod6deb1d2015-08-28 15:54:37 -0700261 'libupdate_engine',
Alex Deymo7504e5f2014-07-15 17:58:51 -0700262 'update_metadata-protos',
263 ],
Alex Deymo5d527802014-07-18 14:24:13 -0700264 'variables': {
265 'exported_deps': [
266 'ext2fs',
267 ],
268 'deps': ['<@(exported_deps)'],
269 },
270 'all_dependent_settings': {
271 'variables': {
272 'deps': [
273 '<@(exported_deps)',
274 ],
275 },
276 },
277 'link_settings': {
278 'variables': {
279 'deps': [
280 '<@(exported_deps)',
281 ],
282 },
283 },
Alex Deymo7504e5f2014-07-15 17:58:51 -0700284 'sources': [
Alex Deymo14158572015-06-13 03:37:08 -0700285 'payload_generator/ab_generator.cc',
Alex Deymo477aec22015-03-24 23:40:48 -0700286 'payload_generator/annotated_operation.cc',
Sen Jiang8cc502d2015-08-10 10:04:54 -0700287 'payload_generator/blob_file_writer.cc',
Alex Deymof0061352015-07-01 14:59:15 -0700288 'payload_generator/block_mapping.cc',
Alex Deymo7504e5f2014-07-15 17:58:51 -0700289 'payload_generator/cycle_breaker.cc',
290 'payload_generator/delta_diff_generator.cc',
Alex Deymo14158572015-06-13 03:37:08 -0700291 'payload_generator/delta_diff_utils.cc',
Alex Deymo2b19cfb2015-03-26 00:35:07 -0700292 'payload_generator/ext2_filesystem.cc',
Alex Deymo1beda782015-06-07 23:01:25 +0200293 'payload_generator/extent_ranges.cc',
Alex Deymo5c6c6552015-06-03 19:06:50 +0200294 'payload_generator/extent_utils.cc',
Alex Deymo7504e5f2014-07-15 17:58:51 -0700295 'payload_generator/full_update_generator.cc',
Alex Deymo9b244df2015-03-11 21:51:18 -0700296 'payload_generator/graph_types.cc',
Alex Deymo7504e5f2014-07-15 17:58:51 -0700297 'payload_generator/graph_utils.cc',
Allie Woodcd514b52015-02-19 13:56:07 -0800298 'payload_generator/inplace_generator.cc',
Alex Deymo14158572015-06-13 03:37:08 -0700299 'payload_generator/payload_file.cc',
Alex Deymof1cbe172015-03-05 15:58:37 -0800300 'payload_generator/payload_generation_config.cc',
Alex Deymo7504e5f2014-07-15 17:58:51 -0700301 'payload_generator/payload_signer.cc',
Alex Deymo2b19cfb2015-03-26 00:35:07 -0700302 'payload_generator/raw_filesystem.cc',
Alex Deymo7504e5f2014-07-15 17:58:51 -0700303 'payload_generator/tarjan.cc',
304 'payload_generator/topological_sort.cc',
Alex Deymoa26432a2015-03-12 16:08:04 -0700305 'payload_generator/verity_utils.cc',
Alex Deymo7504e5f2014-07-15 17:58:51 -0700306 ],
307 },
Alex Deymo719bfff2014-07-11 12:12:32 -0700308 # server-side delta generator.
309 {
310 'target_name': 'delta_generator',
311 'type': 'executable',
Alex Deymo7504e5f2014-07-15 17:58:51 -0700312 'dependencies': [
313 'libupdate_engine',
314 'libpayload_generator',
315 ],
Alex Deymo719bfff2014-07-11 12:12:32 -0700316 'link_settings': {
317 'ldflags!': [
318 '-pie',
319 ],
320 },
321 'sources': [
322 'payload_generator/generate_delta_main.cc',
323 ]
324 },
325 ],
326 'conditions': [
327 ['USE_test == 1', {
328 'targets': [
329 # Public keys used for unit testing.
330 {
331 'target_name': 'update_engine-testkeys',
332 'type': 'none',
333 'variables': {
334 'openssl_pem_in_dir': '.',
335 'openssl_pem_out_dir': 'include/update_engine',
336 },
337 'sources': [
338 'unittest_key.pem',
339 'unittest_key2.pem',
340 ],
Alex Deymoa7a34d82015-08-24 20:47:01 -0700341 'includes': ['../../../platform2/common-mk/openssl_pem.gypi'],
Alex Deymo719bfff2014-07-11 12:12:32 -0700342 },
Alex Deymo04ef2072015-08-13 08:19:16 -0700343 # Unpacks sample images used for testing.
Alex Deymo2b19cfb2015-03-26 00:35:07 -0700344 {
345 'target_name': 'update_engine-test_images',
346 'type': 'none',
347 'variables': {
348 'image_out_dir': '.',
349 },
350 'sources': [
Alex Deymo04ef2072015-08-13 08:19:16 -0700351 'sample_images/sample_images.tar.bz2',
Alex Deymo2b19cfb2015-03-26 00:35:07 -0700352 ],
Alex Deymo04ef2072015-08-13 08:19:16 -0700353 'includes': ['tar_bunzip2.gypi'],
Alex Deymo2b19cfb2015-03-26 00:35:07 -0700354 },
Alex Deymo719bfff2014-07-11 12:12:32 -0700355 # Test HTTP Server.
356 {
357 'target_name': 'test_http_server',
358 'type': 'executable',
359 'dependencies': ['libupdate_engine'],
360 'sources': [
361 'test_http_server.cc',
362 ]
363 },
364 # Main unittest file.
365 {
366 'target_name': 'update_engine_unittests',
367 'type': 'executable',
Alex Deymoa7a34d82015-08-24 20:47:01 -0700368 'includes': ['../../../platform2/common-mk/common_test.gypi'],
Alex Deymo509dd532015-06-10 14:11:05 -0700369 'variables': {
370 'deps': [
371 'libchromeos-test-<(libbase_ver)',
372 'libchrome-test-<(libbase_ver)',
Alex Deymod6deb1d2015-08-28 15:54:37 -0700373 'libdebugd-client-test',
374 'libpower_manager-client-test',
375 'libsession_manager-client-test',
376 'libshill-client-test',
Alex Deymo509dd532015-06-10 14:11:05 -0700377 ],
378 },
Alex Deymo7504e5f2014-07-15 17:58:51 -0700379 'dependencies': [
380 'libupdate_engine',
381 'libpayload_generator',
382 ],
Alex Deymoa7a34d82015-08-24 20:47:01 -0700383 'includes': ['../../../platform2/common-mk/common_test.gypi'],
Alex Deymo719bfff2014-07-11 12:12:32 -0700384 'sources': [
385 'action_pipe_unittest.cc',
386 'action_processor_unittest.cc',
387 'action_unittest.cc',
Alex Deymo763e7db2015-08-27 21:08:08 -0700388 'boot_control_chromeos_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700389 'bzip_extent_writer_unittest.cc',
390 'certificate_checker_unittest.cc',
391 'chrome_browser_proxy_resolver_unittest.cc',
392 'connection_manager_unittest.cc',
Alex Deymob7ca0962014-10-01 17:58:07 -0700393 'dbus_service_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700394 'delta_performer_unittest.cc',
395 'download_action_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700396 'extent_writer_unittest.cc',
397 'fake_prefs.cc',
Alex Deymo30534502015-07-20 15:06:33 -0700398 'fake_shill_proxy.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700399 'fake_system_state.cc',
400 'file_writer_unittest.cc',
Allie Woodeb9e6d82015-04-17 13:55:30 -0700401 'filesystem_verifier_action_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700402 'http_fetcher_unittest.cc',
403 'hwid_override_unittest.cc',
404 'mock_http_fetcher.cc',
405 'omaha_hash_calculator_unittest.cc',
406 'omaha_request_action_unittest.cc',
407 'omaha_request_params_unittest.cc',
408 'omaha_response_handler_action_unittest.cc',
409 'p2p_manager_unittest.cc',
Alex Deymo14158572015-06-13 03:37:08 -0700410 'payload_generator/ab_generator_unittest.cc',
Sen Jiang8cc502d2015-08-10 10:04:54 -0700411 'payload_generator/blob_file_writer_unittest.cc',
Alex Deymof0061352015-07-01 14:59:15 -0700412 'payload_generator/block_mapping_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700413 'payload_generator/cycle_breaker_unittest.cc',
Alex Deymo14158572015-06-13 03:37:08 -0700414 'payload_generator/delta_diff_utils_unittest.cc',
Alex Deymo2b19cfb2015-03-26 00:35:07 -0700415 'payload_generator/ext2_filesystem_unittest.cc',
Alex Deymo1beda782015-06-07 23:01:25 +0200416 'payload_generator/extent_ranges_unittest.cc',
Alex Deymo5c6c6552015-06-03 19:06:50 +0200417 'payload_generator/extent_utils_unittest.cc',
Alex Deymo2b19cfb2015-03-26 00:35:07 -0700418 'payload_generator/fake_filesystem.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700419 'payload_generator/full_update_generator_unittest.cc',
420 'payload_generator/graph_utils_unittest.cc',
Allie Woodcd514b52015-02-19 13:56:07 -0800421 'payload_generator/inplace_generator_unittest.cc',
Alex Deymo923d8fa2014-07-15 17:58:51 -0700422 'payload_generator/payload_signer_unittest.cc',
Alex Deymo14158572015-06-13 03:37:08 -0700423 'payload_generator/payload_file_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700424 'payload_generator/tarjan_unittest.cc',
425 'payload_generator/topological_sort_unittest.cc',
Alex Deymoa26432a2015-03-12 16:08:04 -0700426 'payload_generator/verity_utils_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700427 'payload_state_unittest.cc',
428 'postinstall_runner_action_unittest.cc',
429 'prefs_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700430 'subprocess_unittest.cc',
431 'terminator_unittest.cc',
432 'test_utils.cc',
Alex Deymo10875d92014-11-10 21:52:57 -0800433 'test_utils_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700434 'update_attempter_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700435 'update_manager/boxed_value_unittest.cc',
436 'update_manager/chromeos_policy_unittest.cc',
437 'update_manager/evaluation_context_unittest.cc',
Alex Deymo719bfff2014-07-11 12:12:32 -0700438 'update_manager/generic_variables_unittest.cc',
439 'update_manager/prng_unittest.cc',
440 'update_manager/real_config_provider_unittest.cc',
441 'update_manager/real_device_policy_provider_unittest.cc',
442 'update_manager/real_random_provider_unittest.cc',
443 'update_manager/real_shill_provider_unittest.cc',
444 'update_manager/real_system_provider_unittest.cc',
445 'update_manager/real_time_provider_unittest.cc',
446 'update_manager/real_updater_provider_unittest.cc',
447 'update_manager/umtest_utils.cc',
448 'update_manager/update_manager_unittest.cc',
449 'update_manager/variable_unittest.cc',
450 'utils_unittest.cc',
451 'zip_unittest.cc',
452 # Main entry point for runnning tests.
453 'testrunner.cc',
454 ],
455 },
456 ],
457 }],
458 ],
459}