From 168cb48c1ede1df390ed6efff1a43d69ae6102f6 Mon Sep 17 00:00:00 2001 From: Tim Froehlich Date: Tue, 12 Nov 2024 11:26:05 -0600 Subject: [PATCH] Refactor: Move meter data to definition package Moves the meter data types from the legacy_definition package to the definition package. This change simplifies the codebase by removing the redundant legacy_definition package. Additionally, this change refactors the DesignCompose code to use the new meter data types. # Conflicts: # crates/figma_import/tests/layout-unit-tests.dcf # designcompose/src/main/assets/figma/DesignSwitcherDoc_Ljph4e3sC0lHcynfXpoh9f.dcf # integration-tests/validation/src/main/assets/figma/AlignmentTestDoc_JIjE9oKQbq8ipi66ab5UaK.dcf # integration-tests/validation/src/main/assets/figma/BattleshipDoc_RfGl9SWnBEvdg8T1Ex6ZAR.dcf # integration-tests/validation/src/main/assets/figma/BlendModeTestDoc_ZqX5i5g6inv9tANIwMMXUV.dcf # integration-tests/validation/src/main/assets/figma/ComponentReplaceDoc_bQVVy2GSZJ8veYaJUrG6Ni.dcf # integration-tests/validation/src/main/assets/figma/ComponentReplaceRelayoutDoc_qIh0IOQTCtgeAWZFF5gYSk.dcf # integration-tests/validation/src/main/assets/figma/DialsGaugesTestDoc_lZj6E9GtIQQE4HNLpzgETw.dcf # integration-tests/validation/src/main/assets/figma/FancyFillTestDoc_xQ9cunHt8VUm6xqJJ2Pjb2.dcf # integration-tests/validation/src/main/assets/figma/GridLayoutDoc_MBNjjSbzzKeN7nBjVoewsl.dcf # integration-tests/validation/src/main/assets/figma/GridLayoutTestDoc_JOSOEvsrjvMqanyQa5OpNR.dcf # integration-tests/validation/src/main/assets/figma/GridWidgetTestDoc_OBhNItd9i9J2LwVYuLxEIx.dcf # integration-tests/validation/src/main/assets/figma/HelloVersionDoc_v62Vwlxa4Bb6nopJiAxQAQ_5668177823.dcf # integration-tests/validation/src/main/assets/figma/ImageUpdateTestDoc_oQw7kiy94fvdVouCYBC9T0.dcf # integration-tests/validation/src/main/assets/figma/InteractionTestDoc_8Zg9viyjYTnyN29pbkR1CE.dcf # integration-tests/validation/src/main/assets/figma/LayoutReplacementTestDoc_dwk2GF7RiNvlbbAKPjqldx.dcf # integration-tests/validation/src/main/assets/figma/LayoutTestsDoc_Gv63fYTzpeH2ZtxP4go31E.dcf # integration-tests/validation/src/main/assets/figma/ListWidgetTestDoc_9ev0MBNHFrgTqJOrAGcEpV.dcf # integration-tests/validation/src/main/assets/figma/MaskTestDoc_mEmdUVEIjvBBbV0kELPy37.dcf # integration-tests/validation/src/main/assets/figma/ModuleExampleDoc_hPEGkrF0LUqNYEZObXqjXZ.dcf # integration-tests/validation/src/main/assets/figma/OpenLinkTestDoc_r7m4tqyKv6y9DWcg7QBEDf.dcf # integration-tests/validation/src/main/assets/figma/RecursiveCustomizationsDoc_o0GWzcqdOWEgzj4kIeIlAu.dcf # integration-tests/validation/src/main/assets/figma/ShadowsTestDoc_OqK58Y46IqP4wIgKCWys48.dcf # integration-tests/validation/src/main/assets/figma/SmartAnimateTestDoc_RW3lFurXCoVDeqY2Y7bf4v.dcf # integration-tests/validation/src/main/assets/figma/TelltaleTestDoc_TZgHrKWx8wvQM7UPTyEpmz.dcf # integration-tests/validation/src/main/assets/figma/VariableBorderTestDoc_MWnVAfW3FupV4VMLNR1m67.dcf # integration-tests/validation/src/main/assets/figma/VariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf # integration-tests/validation/src/main/assets/figma/VariantAnimationTestDoc_pghyUUhlzJNoxxSK86ngiw.dcf # integration-tests/validation/src/main/assets/figma/VariantAnimationTimelineTestDoc_vJRf4zxY4QX4zzSSUd1nJ5.dcf # integration-tests/validation/src/main/assets/figma/VariantAsteriskTestDoc_gQeYHGCSaBE4zYSFpBrhre.dcf # integration-tests/validation/src/main/assets/figma/VariantInteractionsTestDoc_WcsgoLR4aDRSkZHY29Qdhq.dcf # integration-tests/validation/src/main/assets/figma/VariantPropertiesTestDoc_4P7zDdrQxj7FZsKJoIQcx1.dcf # integration-tests/validation/src/main/assets/figma/VectorRenderingTestDoc_Z3ucY0wMAbIwZIa6mLEWIK.dcf # reference-apps/tutorial/app/src/main/assets/figma/TutorialDoc_3z4xExq0INrL9vxPhj9tl7.dcf --- crates/dc_bundle/src/legacy_definition.rs | 1 - .../dc_bundle/src/legacy_definition/plugin.rs | 17 --- .../legacy_definition/plugin/meter_data.rs | 90 -------------- .../src/legacy_definition/view/node_style.rs | 2 +- crates/figma_import/src/figma_schema.rs | 27 +++++ crates/figma_import/src/lib.rs | 2 +- crates/figma_import/src/meter_schema.rs | 110 +++++++++++++++++ crates/figma_import/src/reflection.rs | 14 +-- crates/figma_import/src/toolkit_style.rs | 62 ---------- crates/figma_import/src/transform_flexbox.rs | 112 ++++++++++-------- .../figma_import/tests/layout-unit-tests.dcf | Bin 27687 -> 27687 bytes ...signSwitcherDoc_Ljph4e3sC0lHcynfXpoh9f.dcf | Bin 400548 -> 400548 bytes .../com/android/designcompose/FrameRender.kt | 44 +++---- ...lignmentTestDoc_JIjE9oKQbq8ipi66ab5UaK.dcf | Bin 445672 -> 445672 bytes .../BattleshipDoc_RfGl9SWnBEvdg8T1Ex6ZAR.dcf | Bin 1023147 -> 1023147 bytes ...onentReplaceDoc_bQVVy2GSZJ8veYaJUrG6Ni.dcf | Bin 19744 -> 19744 bytes ...tTapCallbackDoc_1jeKYynjk1nqYblZ66QDDK.dcf | Bin 8802 -> 8802 bytes ...AxisFillTestDoc_GPr1cx4n3zBPwLhqlSL1ba.dcf | Bin 10103 -> 10103 bytes ...lsGaugesTestDoc_lZj6E9GtIQQE4HNLpzgETw.dcf | Bin 252455 -> 263353 bytes ...ancyFillTestDoc_xQ9cunHt8VUm6xqJJ2Pjb2.dcf | Bin 80809 -> 80809 bytes .../GridLayoutDoc_MBNjjSbzzKeN7nBjVoewsl.dcf | Bin 33238 -> 33238 bytes ...idLayoutTestDoc_JOSOEvsrjvMqanyQa5OpNR.dcf | Bin 167308 -> 167308 bytes ...idWidgetTestDoc_OBhNItd9i9J2LwVYuLxEIx.dcf | Bin 332463 -> 332463 bytes ...nDoc_v62Vwlxa4Bb6nopJiAxQAQ_5668177823.dcf | Bin 29874 -> 29874 bytes ...geUpdateTestDoc_oQw7kiy94fvdVouCYBC9T0.dcf | Bin 24044 -> 24044 bytes ...eractionTestDoc_8Zg9viyjYTnyN29pbkR1CE.dcf | Bin 315462 -> 315462 bytes ...lacementTestDoc_dwk2GF7RiNvlbbAKPjqldx.dcf | Bin 14313 -> 14313 bytes .../LayoutTestsDoc_Gv63fYTzpeH2ZtxP4go31E.dcf | Bin 192960 -> 192922 bytes ...stWidgetTestDoc_9ev0MBNHFrgTqJOrAGcEpV.dcf | Bin 260090 -> 260090 bytes .../MaskTestDoc_mEmdUVEIjvBBbV0kELPy37.dcf | Bin 34618 -> 34596 bytes ...oduleExampleDoc_hPEGkrF0LUqNYEZObXqjXZ.dcf | Bin 34638 -> 34638 bytes ...OpenLinkTestDoc_r7m4tqyKv6y9DWcg7QBEDf.dcf | Bin 25994 -> 26003 bytes ...stomizationsDoc_o0GWzcqdOWEgzj4kIeIlAu.dcf | Bin 6992 -> 6992 bytes .../ShadowsTestDoc_OqK58Y46IqP4wIgKCWys48.dcf | Bin 202364 -> 202364 bytes ...tAnimateTestDoc_RW3lFurXCoVDeqY2Y7bf4v.dcf | Bin 1896145 -> 1896145 bytes ...stomizationsDoc_POWyniB6moGRmhZTJyejwa.dcf | Bin 21981 -> 21861 bytes ...TelltaleTestDoc_TZgHrKWx8wvQM7UPTyEpmz.dcf | Bin 52404 -> 52404 bytes ...extElideTestDoc_oQ7nK49Ya5PJ3GpjI5iy8d.dcf | Bin 6922 -> 6922 bytes ...ariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf | Bin 58311 -> 58311 bytes ...nimationTestDoc_pghyUUhlzJNoxxSK86ngiw.dcf | Bin 1348642 -> 1348642 bytes ...TimelineTestDoc_vJRf4zxY4QX4zzSSUd1nJ5.dcf | Bin 1732689 -> 1732689 bytes ...AsteriskTestDoc_gQeYHGCSaBE4zYSFpBrhre.dcf | Bin 27303 -> 27303 bytes ...ractionsTestDoc_WcsgoLR4aDRSkZHY29Qdhq.dcf | Bin 54835 -> 54835 bytes ...opertiesTestDoc_4P7zDdrQxj7FZsKJoIQcx1.dcf | Bin 133566 -> 133566 bytes proto/definition/plugin/meter_data.proto | 8 ++ .../TutorialDoc_3z4xExq0INrL9vxPhj9tl7.dcf | Bin 55727 -> 55727 bytes 46 files changed, 238 insertions(+), 251 deletions(-) delete mode 100644 crates/dc_bundle/src/legacy_definition/plugin.rs delete mode 100644 crates/dc_bundle/src/legacy_definition/plugin/meter_data.rs create mode 100644 crates/figma_import/src/meter_schema.rs delete mode 100644 crates/figma_import/src/toolkit_style.rs diff --git a/crates/dc_bundle/src/legacy_definition.rs b/crates/dc_bundle/src/legacy_definition.rs index d7832432e..4d673fcc1 100644 --- a/crates/dc_bundle/src/legacy_definition.rs +++ b/crates/dc_bundle/src/legacy_definition.rs @@ -28,7 +28,6 @@ use crate::definition::element::VariableMap; use crate::legacy_definition::element::node::NodeQuery; pub mod element; -pub mod plugin; pub mod view; /// EncodedImageMap contains a mapping from ImageKey to network bytes. It can create an diff --git a/crates/dc_bundle/src/legacy_definition/plugin.rs b/crates/dc_bundle/src/legacy_definition/plugin.rs deleted file mode 100644 index 696641381..000000000 --- a/crates/dc_bundle/src/legacy_definition/plugin.rs +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2024 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -pub mod meter_data; diff --git a/crates/dc_bundle/src/legacy_definition/plugin/meter_data.rs b/crates/dc_bundle/src/legacy_definition/plugin/meter_data.rs deleted file mode 100644 index 5e9cb2310..000000000 --- a/crates/dc_bundle/src/legacy_definition/plugin/meter_data.rs +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2024 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct RotationMeterData { - pub enabled: bool, - pub start: f32, - pub end: f32, - pub discrete: bool, - pub discrete_value: f32, -} - -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct ArcMeterData { - pub enabled: bool, - pub start: f32, - pub end: f32, - pub discrete: bool, - pub discrete_value: f32, - pub corner_radius: f32, -} - -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct ProgressBarMeterData { - pub enabled: bool, - pub discrete: bool, - pub discrete_value: f32, - #[serde(default)] - pub vertical: bool, - #[serde(default)] - pub end_x: f32, - #[serde(default)] - pub end_y: f32, -} - -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct ProgressMarkerMeterData { - pub enabled: bool, - pub discrete: bool, - pub discrete_value: f32, - #[serde(default)] - pub vertical: bool, - #[serde(default)] - pub start_x: f32, - #[serde(default)] - pub end_x: f32, - #[serde(default)] - pub start_y: f32, - #[serde(default)] - pub end_y: f32, -} - -// Schema for progress vector data that we write to serialized data -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct ProgressVectorMeterData { - pub enabled: bool, - pub discrete: bool, - pub discrete_value: f32, -} - -// Schema for dials & gauges data that we write to serialized data -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] -#[serde(rename_all = "camelCase")] -pub enum MeterData { - ArcData(ArcMeterData), - RotationData(RotationMeterData), - ProgressBarData(ProgressBarMeterData), - ProgressMarkerData(ProgressMarkerMeterData), - ProgressVectorData(ProgressVectorMeterData), -} diff --git a/crates/dc_bundle/src/legacy_definition/view/node_style.rs b/crates/dc_bundle/src/legacy_definition/view/node_style.rs index 2c2bc33b8..746cc7636 100644 --- a/crates/dc_bundle/src/legacy_definition/view/node_style.rs +++ b/crates/dc_bundle/src/legacy_definition/view/node_style.rs @@ -27,7 +27,7 @@ use crate::definition::modifier::{ BlendMode, FilterOp, TextAlign, TextAlignVertical, TextOverflow, }; use crate::definition::modifier::{BoxShadow, LayoutTransform, TextShadow}; -use crate::legacy_definition::plugin::meter_data::MeterData; +use crate::definition::plugin::meter_data::MeterData; use serde::{Deserialize, Serialize}; #[derive(Copy, Clone, PartialEq, Debug, Serialize, Deserialize)] diff --git a/crates/figma_import/src/figma_schema.rs b/crates/figma_import/src/figma_schema.rs index fb767a8ec..e5797a056 100644 --- a/crates/figma_import/src/figma_schema.rs +++ b/crates/figma_import/src/figma_schema.rs @@ -17,6 +17,7 @@ use std::collections::HashMap; use dc_bundle::definition::element::Color; use dc_bundle::definition::element::FloatColor; use serde::{Deserialize, Serialize}; +use dc_bundle::definition::element; // We use serde to decode Figma's JSON documents into Rust structures. // These structures were derived from Figma's public API documentation, which has more information @@ -1372,3 +1373,29 @@ pub struct VariablesResponse { pub status: i32, pub meta: VariablesMeta, } + +pub(crate) fn parse_path(path: &Path) -> Option { + let mut output = element::Path::new(); + for segment in svgtypes::SimplifyingPathParser::from(path.path.as_str()) { + match segment { + Ok(svgtypes::SimplePathSegment::MoveTo { x, y }) => { + output.move_to(x as f32, y as f32); + } + Ok(svgtypes::SimplePathSegment::LineTo { x, y }) => { + output.line_to(x as f32, y as f32); + } + Ok(svgtypes::SimplePathSegment::CurveTo { x1, y1, x2, y2, x, y }) => { + output.cubic_to(x1 as f32, y1 as f32, x2 as f32, y2 as f32, x as f32, y as f32); + } + Ok(svgtypes::SimplePathSegment::Quadratic { x1, y1, x, y }) => { + output.quad_to(x1 as f32, y1 as f32, x as f32, y as f32); + } + Ok(svgtypes::SimplePathSegment::ClosePath) => { + output.close(); + } + Err(_) => return None, + } + } + output.with_winding_rule(path.winding_rule.into()); + Some(output) +} \ No newline at end of file diff --git a/crates/figma_import/src/lib.rs b/crates/figma_import/src/lib.rs index 84da945a2..613421551 100644 --- a/crates/figma_import/src/lib.rs +++ b/crates/figma_import/src/lib.rs @@ -27,7 +27,7 @@ mod fetch; mod figma_schema; mod image_context; pub mod reaction_schema; -pub mod toolkit_style; +pub mod meter_schema; pub mod tools; mod transform_flexbox; mod variable_utils; diff --git a/crates/figma_import/src/meter_schema.rs b/crates/figma_import/src/meter_schema.rs new file mode 100644 index 000000000..d1af11f26 --- /dev/null +++ b/crates/figma_import/src/meter_schema.rs @@ -0,0 +1,110 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! `toolkit_style` contains all of the style-related types that `toolkit_schema::View` +//! uses. + +use crate::figma_schema; + +use dc_bundle::definition::plugin::meter_data::MeterData; +use dc_bundle::definition::plugin::{ + ArcMeterData, ProgressBarMeterData, ProgressMarkerMeterData, ProgressVectorMeterData, + RotationMeterData, +}; +use serde::{Deserialize, Serialize}; +use dc_bundle::definition::element::Path; +use dc_bundle::legacy_definition::view::view_style::ViewStyle; + +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct RotationMeterJson { + pub enabled: bool, + pub start: f32, + pub end: f32, + pub discrete: bool, + pub discrete_value: f32, +} + +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct ArcMeterJson { + pub enabled: bool, + pub start: f32, + pub end: f32, + pub discrete: bool, + pub discrete_value: f32, + pub corner_radius: f32, +} + +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct ProgressBarMeterJson { + pub enabled: bool, + pub discrete: bool, + pub discrete_value: f32, + #[serde(default)] + pub vertical: bool, + #[serde(default)] + pub end_x: f32, + #[serde(default)] + pub end_y: f32, +} + +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct ProgressMarkerMeterJson { + pub enabled: bool, + pub discrete: bool, + pub discrete_value: f32, + #[serde(default)] + pub vertical: bool, + #[serde(default)] + pub start_x: f32, + #[serde(default)] + pub end_x: f32, + #[serde(default)] + pub start_y: f32, + #[serde(default)] + pub end_y: f32, +} + +// // Schema for progress vector data that we write to serialized data +// #[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] +// #[serde(rename_all = "camelCase")] +// pub struct ProgressVectorMeterJson { +// pub enabled: bool, +// pub discrete: bool, +// pub discrete_value: f32, +// } + +// Schema for progress vector data that we read from Figma plugin data +#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct ProgressVectorMeterJson { + pub enabled: bool, + pub discrete: bool, + pub discrete_value: f32, + pub paths: Vec, +} + +// Schema for dials & gauges Figma plugin data +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[serde(rename_all = "camelCase")] +pub enum MeterJson { + ArcJson(ArcMeterJson), + RotationJson(RotationMeterJson), + ProgressBarJson(ProgressBarMeterJson), + ProgressMarkerJson(ProgressMarkerMeterJson), + ProgressVectorJson(ProgressVectorMeterJson), +} diff --git a/crates/figma_import/src/reflection.rs b/crates/figma_import/src/reflection.rs index 887b6f517..914be5179 100644 --- a/crates/figma_import/src/reflection.rs +++ b/crates/figma_import/src/reflection.rs @@ -95,23 +95,19 @@ pub fn registry() -> serde_reflection::Result { .trace_type::(&samples) .expect("couldn't trace GridLayoutType"); tracer - .trace_type::(&samples) + .trace_type::(&samples) .expect("couldn't trace RotationMeterData"); tracer - .trace_type::(&samples) + .trace_type::(&samples) .expect("couldn't trace ArcMeterData"); tracer - .trace_type::( - &samples, - ) + .trace_type::(&samples) .expect("couldn't trace ProgressBarMeterData"); tracer - .trace_type::( - &samples, - ) + .trace_type::(&samples) .expect("couldn't trace ProgressVectorMeterData"); tracer - .trace_type::(&samples) + .trace_type::(&samples) .expect("couldn't trace MeterData"); tracer .trace_type::(&samples) diff --git a/crates/figma_import/src/toolkit_style.rs b/crates/figma_import/src/toolkit_style.rs deleted file mode 100644 index c9ac4d3ca..000000000 --- a/crates/figma_import/src/toolkit_style.rs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2023 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! `toolkit_style` contains all of the style-related types that `toolkit_schema::View` -//! uses. - -use crate::figma_schema; -use dc_bundle::legacy_definition::plugin::meter_data::{ - ArcMeterData, MeterData, ProgressBarMeterData, ProgressMarkerMeterData, - ProgressVectorMeterData, RotationMeterData, -}; -use serde::{Deserialize, Serialize}; - -// Schema for progress vector data that we read from Figma plugin data -#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct ProgressVectorMeterDataSchema { - pub enabled: bool, - pub discrete: bool, - pub discrete_value: f32, - pub paths: Vec, -} - -// Schema for dials & gauges Figma plugin data -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] -#[serde(rename_all = "camelCase")] -pub enum MeterDataSchema { - ArcData(ArcMeterData), - RotationData(RotationMeterData), - ProgressBarData(ProgressBarMeterData), - ProgressMarkerData(ProgressMarkerMeterData), - ProgressVectorData(ProgressVectorMeterDataSchema), -} - -impl Into for MeterDataSchema { - fn into(self) -> MeterData { - match self { - MeterDataSchema::ArcData(data) => MeterData::ArcData(data), - MeterDataSchema::RotationData(data) => MeterData::RotationData(data), - MeterDataSchema::ProgressBarData(data) => MeterData::ProgressBarData(data), - MeterDataSchema::ProgressMarkerData(data) => MeterData::ProgressMarkerData(data), - MeterDataSchema::ProgressVectorData(data) => { - MeterData::ProgressVectorData(ProgressVectorMeterData { - enabled: data.enabled, - discrete: data.discrete, - discrete_value: data.discrete_value, - }) - } - } - } -} diff --git a/crates/figma_import/src/transform_flexbox.rs b/crates/figma_import/src/transform_flexbox.rs index 2232254a3..f37a5c1b2 100644 --- a/crates/figma_import/src/transform_flexbox.rs +++ b/crates/figma_import/src/transform_flexbox.rs @@ -18,21 +18,16 @@ use std::collections::HashMap; use std::f32::consts::PI; -use crate::toolkit_style::MeterDataSchema; +use crate::meter_schema::MeterJson; -use crate::{ - component_context::ComponentContext, - extended_layout_schema::{ExtendedAutoLayout, LayoutType, SizePolicy}, - image_context::ImageContext, - variable_utils::{bound_variables_color, FromFigmaVar}, -}; -use crate::{figma_schema, Error}; +use crate::{component_context::ComponentContext, extended_layout_schema::{ExtendedAutoLayout, LayoutType, SizePolicy}, figma_schema, image_context::ImageContext, variable_utils::{bound_variables_color, FromFigmaVar}}; +use crate::{ Error}; use dc_bundle::definition::element::{ view_shape, DimensionProto, DimensionRect, DimensionRectExt, FontFeature, FontStyle, FontWeight, Size, ViewShape, }; -use crate::figma_schema::LayoutPositioning; +use crate::figma_schema::{parse_path, LayoutPositioning}; use crate::reaction_schema::{FrameExtrasJson, ReactionJson}; use dc_bundle::definition; use dc_bundle::definition::element::dimension_proto::Dimension; @@ -52,8 +47,12 @@ use dc_bundle::definition::modifier::{ filter_op, BoxShadow, FilterOp, TextAlign, TextAlignVertical, TextOverflow, TextShadow, }; use dc_bundle::definition::modifier::{BlendMode, LayoutTransform}; -use dc_bundle::definition::plugin::FrameExtras; +use dc_bundle::definition::plugin::{ + ArcMeterData, FrameExtras, ProgressBarMeterData, ProgressMarkerMeterData, + ProgressVectorMeterData, RotationMeterData, +}; +use dc_bundle::definition::plugin::meter_data::MeterData; use dc_bundle::legacy_definition::view::component::ComponentInfo; use dc_bundle::legacy_definition::view::text_style::{StyledTextRun, TextStyle}; use dc_bundle::legacy_definition::view::view::{RenderMethod, ScrollInfo, View}; @@ -1427,7 +1426,7 @@ fn visit_node( // Convert any path data we have; we'll use it for non-frame types. let fill_paths = if let Some(fills) = &node.fill_geometry { - fills.iter().filter_map(parse_path).collect() + fills.iter().filter_map(figma_schema::parse_path).collect() } else { Vec::new() }; @@ -1437,7 +1436,7 @@ fn visit_node( // stroke treatment. However, when a shape has no area (e.g.: it is a line), then the // fill geometry will be empty so we *have* to use the stroke geometry. let mut stroke_paths = if let Some(strokes) = &node.stroke_geometry { - strokes.iter().filter_map(parse_path).collect() + strokes.iter().filter_map(figma_schema::parse_path).collect() } else { Vec::new() }; @@ -1541,18 +1540,60 @@ fn visit_node( // a type of meter (dials/gauges/progress bars) if let Some(vsw_data) = plugin_data { if let Some(data) = vsw_data.get("vsw-meter-data") { - let meter_data: Option = serde_json::from_str(data.as_str()).ok(); + let meter_data: Option = serde_json::from_str(data.as_str()).ok(); if let Some(meter_data) = meter_data { - if let MeterDataSchema::ProgressVectorData(vector_data) = &meter_data { - // If this is a progress vector node, we read in data as a ProgressVectorMeterDataSchema, - // which contains vector drawing instructions as a string. We convert this into vector - // drawing instructions in a ProgressVectorMeterData struct and replace the normal stroke - // vector data with it. - if vector_data.enabled { - stroke_paths = vector_data.paths.iter().filter_map(parse_path).collect(); + style.node_style.meter_data = Some(match meter_data { + MeterJson::ArcJson(data) => MeterData::ArcData(ArcMeterData { + enabled: data.enabled, + start: data.start, + end: data.end, + discrete: data.discrete, + discrete_value: data.discrete_value, + corner_radius: data.corner_radius, + }), + MeterJson::RotationJson(data) => MeterData::RotationData(RotationMeterData { + enabled: data.enabled, + start: data.start, + end: data.end, + discrete: data.discrete, + discrete_value: data.discrete_value, + }), + MeterJson::ProgressBarJson(data) => { + MeterData::ProgressBarData(ProgressBarMeterData { + enabled: data.enabled, + discrete: data.discrete, + discrete_value: data.discrete_value, + vertical: data.vertical, + end_x: data.end_x, + end_y: data.end_y, + }) } - } - style.node_style.meter_data = Some(meter_data.into()); + MeterJson::ProgressMarkerJson(data) => { + MeterData::ProgressMarkerData(ProgressMarkerMeterData { + enabled: data.enabled, + discrete: data.discrete, + discrete_value: data.discrete_value, + vertical: data.vertical, + start_x: data.start_x, + end_x: data.end_x, + start_y: data.start_y, + end_y: data.end_y, + }) + } + MeterJson::ProgressVectorJson(data) => { + // ProgressVectors contain vector drawing instructions as a string. We convert this into vector + // drawing instructions in a ProgressVectorMeterData struct and replace the normal stroke + // vector data with it. + if data.enabled { + stroke_paths = data.paths.iter().filter_map(parse_path).collect(); + } + MeterData::ProgressVectorData(ProgressVectorMeterData { + enabled: data.enabled, + discrete: data.discrete, + discrete_value: data.discrete_value, + }) + } + }) } } } @@ -1684,6 +1725,7 @@ fn visit_node( Ok(view) } + /// Transform a node in the Figma schema to a View in the toolkit schema. From here, a /// real toolkit View can be created, or the tree can be serialized and read in by /// another process. @@ -1710,32 +1752,6 @@ pub fn create_component_flexbox( ) } -fn parse_path(path: &figma_schema::Path) -> Option { - let mut output = Path::new(); - for segment in svgtypes::SimplifyingPathParser::from(path.path.as_str()) { - match segment { - Ok(svgtypes::SimplePathSegment::MoveTo { x, y }) => { - output.move_to(x as f32, y as f32); - } - Ok(svgtypes::SimplePathSegment::LineTo { x, y }) => { - output.line_to(x as f32, y as f32); - } - Ok(svgtypes::SimplePathSegment::CurveTo { x1, y1, x2, y2, x, y }) => { - output.cubic_to(x1 as f32, y1 as f32, x2 as f32, y2 as f32, x as f32, y as f32); - } - Ok(svgtypes::SimplePathSegment::Quadratic { x1, y1, x, y }) => { - output.quad_to(x1 as f32, y1 as f32, x as f32, y as f32); - } - Ok(svgtypes::SimplePathSegment::ClosePath) => { - output.close(); - } - Err(_) => return None, - } - } - output.with_winding_rule(path.winding_rule.into()); - Some(output) -} - impl Into for figma_schema::LayoutSizing { fn into(self) -> LayoutSizing { match self { diff --git a/crates/figma_import/tests/layout-unit-tests.dcf b/crates/figma_import/tests/layout-unit-tests.dcf index 932d88998d91e6a464e5859a1ef86e9cce09778e..7e3de40b6e17368c3face233b9e1c0120627574e 100644 GIT binary patch delta 333 zcmWO0&nv@m9LI65_xEdl&aW}QeYcrkX%t$amPmf3Nn1-uN=g*s;OBvIaI-$Glmpqp z1;tC@;-no=jf!17!3$g`7^ezBaI6ayE@XDK6NN+zRw9ORo^p^ z!O8wbK_=h)Cjx`pgQo4^bilOzJ_An9`n~}dgKcM`!VN_z;c>$wP|CHY4M7?Iy!)b} z4jU49>39Xeu&ZAne0R5N(CDfTYS6h$$M;SHA;t8MBzvd2CGa2<#kB z8xiF5#=5GbfGs%@9ff?d-wLuADf|Mmxl+6($T=^Iin4SVC}(9y9B|XxxhbgNPS+(+ M$?l#SQK!?(|NRDLCIA2c delta 336 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 diff --git a/designcompose/src/main/java/com/android/designcompose/FrameRender.kt b/designcompose/src/main/java/com/android/designcompose/FrameRender.kt index c90262b91..4cf8f1307 100644 --- a/designcompose/src/main/java/com/android/designcompose/FrameRender.kt +++ b/designcompose/src/main/java/com/android/designcompose/FrameRender.kt @@ -123,7 +123,7 @@ private fun calculateRotationData( ): androidx.compose.ui.graphics.Matrix { val rotation = (rotationData.start + meterValue / 100f * (rotationData.end - rotationData.start)) - .coerceDiscrete(rotationData.discrete, rotationData.discreteValue) + .coerceDiscrete(rotationData.discrete, rotationData.discrete_value) val nodeWidth = style.fixedWidth(density) val nodeHeight = style.fixedHeight(density) @@ -170,7 +170,7 @@ private fun calculateProgressBarData( ): Pair { // Progress bar discrete values are done by percentage val discretizedMeterValue = - meterValue.coerceDiscrete(progressBarData.discrete, progressBarData.discreteValue) + meterValue.coerceDiscrete(progressBarData.discrete, progressBarData.discrete_value) // Resize the progress bar by interpolating between 0 and endX or endY depending on whether it // is a horizontal or vertical progress bar @@ -178,7 +178,7 @@ private fun calculateProgressBarData( val width = style.layout_style.width.getDim().pointsAsDp(density).value // Calculate bar extents from the parent layout if it exists, or from the progress bar data // if not. - var endY = progressBarData.endY + var endY = progressBarData.end_y parent?.let { p -> val parentSize = p.computedLayout?.let { Size(it.width, it.height) } parentSize?.let { pSize -> @@ -196,7 +196,7 @@ private fun calculateProgressBarData( val height = style.layout_style.height.getDim().pointsAsDp(density).value // Calculate bar extents from the parent layout if it exists, or from the progress bar data // if not. - var endX = progressBarData.endX + var endX = progressBarData.end_x parent?.let { p -> val parentSize = p.computedLayout?.let { Size(it.width, it.height) } parentSize?.let { pSize -> @@ -219,7 +219,7 @@ private fun calculateProgressMarkerData( ): androidx.compose.ui.graphics.Matrix { // Progress marker discrete values are done by percentage val discretizedMeterValue = - meterValue.coerceDiscrete(markerData.discrete, markerData.discreteValue) + meterValue.coerceDiscrete(markerData.discrete, markerData.discrete_value) // Calculate node and parent render sizes if available. These will only be available for // squoosh, and will be used to calculate the progress sizes and extents @@ -239,14 +239,14 @@ private fun calculateProgressMarkerData( val overrideTransform = style.getTransform(density) if (markerData.vertical) { var startY = - parentSize?.let { it.height - (mySize?.height ?: 0f) / 2f } ?: markerData.startY - val endY = mySize?.let { -it.height / 2f } ?: markerData.endY + parentSize?.let { it.height - (mySize?.height ?: 0f) / 2f } ?: markerData.start_y + val endY = mySize?.let { -it.height / 2f } ?: markerData.end_y val moveY = lerp(startY, endY, discretizedMeterValue, density) val topOffset = style.layout_style.margin.top.pointsAsDp(density).value overrideTransform.setYTranslation(moveY - topOffset) } else { - var startX = mySize?.let { -it.width / 2f } ?: markerData.startX - var endX = parentSize?.let { it.width - (mySize?.width ?: 0f) / 2f } ?: markerData.endX + var startX = mySize?.let { -it.width / 2f } ?: markerData.start_x + var endX = parentSize?.let { it.width - (mySize?.width ?: 0f) / 2f } ?: markerData.end_x val moveX = lerp(startX, endX, discretizedMeterValue, density) val leftOffset = style.layout_style.margin.start.pointsAsDp(density).value overrideTransform.setXTranslation(moveX - leftOffset) @@ -266,7 +266,7 @@ private fun calculateArcData( val arcAngleMeter = (arcMeterValue / 100f * (arcData.end - arcData.start)).coerceDiscrete( arcData.discrete, - arcData.discreteValue, + arcData.discrete_value, ) if (shape.shape.get() is Shape.Arc) { val arc = (shape.shape.get() as Shape.Arc).value @@ -280,7 +280,7 @@ private fun calculateArcData( arcData.start, arcAngleMeter, arc.inner_radius, - arcData.cornerRadius, + arcData.corner_radius, arc.is_mask, ) ) @@ -302,7 +302,7 @@ private fun calculateProgressVectorData( density: Float, ) { val strokeWidth = style.node_style.stroke.stroke_weight.toUniform() * density - val discretizedMeterValue = meterValue.coerceDiscrete(data.discrete, data.discreteValue) + val discretizedMeterValue = meterValue.coerceDiscrete(data.discrete, data.discrete_value) // Get full length of path var pathLen = 0f @@ -357,14 +357,14 @@ internal fun ContentDrawScope.render( // Check if there is meter data for a dial/gauge/progress bar if (style.node_style.meter_data.isPresent) { when (val meterData = style.node_style.meter_data.get()) { - is MeterData.rotationData -> { + is MeterData.RotationData -> { val rotationData = meterData.value if (rotationData.enabled) { overrideTransform = calculateRotationData(rotationData, meterValue, style, density) } } - is MeterData.progressBarData -> { + is MeterData.ProgressBarData -> { val progressBarData = meterData.value if (progressBarData.enabled) { val progressBarSizeTransform = @@ -379,7 +379,7 @@ internal fun ContentDrawScope.render( overrideTransform = progressBarSizeTransform.second } } - is MeterData.progressMarkerData -> { + is MeterData.ProgressMarkerData -> { val progressMarkerData = meterData.value if (progressMarkerData.enabled) { overrideTransform = @@ -393,14 +393,14 @@ internal fun ContentDrawScope.render( ) } } - is MeterData.arcData -> { + is MeterData.ArcData -> { val arcData = meterData.value if (arcData.enabled) { shape = calculateArcData(arcData, meterValue, shape) customArcAngle = true } } - is MeterData.progressVectorData -> { + is MeterData.ProgressVectorData -> { // If this is a vector path progress bar, save it here so we can convert it to a // set of path instructions and render it instead of the normal stroke. if (meterData.value.enabled) progressVectorMeterData = meterData.value @@ -633,14 +633,14 @@ internal fun ContentDrawScope.squooshShapeRender( // Check if there is meter data for a dial/gauge/progress bar if (style.node_style.meter_data.isPresent) { when (val meterData = style.node_style.meter_data.get()) { - is MeterData.rotationData -> { + is MeterData.RotationData -> { val rotationData = meterData.value if (rotationData.enabled) { overrideTransform = calculateRotationData(rotationData, meterValue, style, density) } } - is MeterData.progressBarData -> { + is MeterData.ProgressBarData -> { val progressBarData = meterData.value if (progressBarData.enabled) { val progressBarSizeTransform = @@ -655,7 +655,7 @@ internal fun ContentDrawScope.squooshShapeRender( overrideTransform = progressBarSizeTransform.second } } - is MeterData.progressMarkerData -> { + is MeterData.ProgressMarkerData -> { val progressMarkerData = meterData.value if (progressMarkerData.enabled) { overrideTransform = @@ -669,14 +669,14 @@ internal fun ContentDrawScope.squooshShapeRender( ) } } - is MeterData.arcData -> { + is MeterData.ArcData -> { val arcData = meterData.value if (arcData.enabled) { shape = calculateArcData(arcData, meterValue, shape) customArcAngle = true } } - is MeterData.progressVectorData -> { + is MeterData.ProgressVectorData -> { // If this is a vector path progress bar, save it here so we can convert it to a // set of path instructions and render it instead of the normal stroke. if (meterData.value.enabled) progressVectorMeterData = meterData.value diff --git a/integration-tests/validation/src/main/assets/figma/AlignmentTestDoc_JIjE9oKQbq8ipi66ab5UaK.dcf b/integration-tests/validation/src/main/assets/figma/AlignmentTestDoc_JIjE9oKQbq8ipi66ab5UaK.dcf index d7e117e2e0e823cdc9ea6c50fe1c5518dddb439d..56e69bc82484b7f5c5616cb667237c251c5ba346 100644 GIT binary patch delta 4494 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 Ar~m)} delta 4494 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 diff --git a/integration-tests/validation/src/main/assets/figma/BattleshipDoc_RfGl9SWnBEvdg8T1Ex6ZAR.dcf b/integration-tests/validation/src/main/assets/figma/BattleshipDoc_RfGl9SWnBEvdg8T1Ex6ZAR.dcf index ce1186db9cc4652c1898ff6cba1358cccc427b43..d2b02ad24583e37492b86fb755c99da6831baf6f 100644 GIT binary patch delta 9640 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 delta 9391 zcmY+KcU% zWp151T?osxG~1u5*k)P}9phE8-LyuymfA$V>FeX^VDKiRj)JDbkd0CI;_t6@~x1?gA_|mjCR*VZ0hfQBxz4p>GUw2uZ>(vnAh-rP&AWjqC zo7Sl&i&gQ1X$_CH+r%@|mmKM}=EtoQ;t$g|VpdsMb+Yd78$0VA>(e#|m4NG}{q@|w zQYrgo$Furq*|om$R4zZJe<5y|R``1>h5Y@5?oq?)d>rBn>l0$t=yO~VV?r#Y?=4k~ z4YBSFEG6W!Q~G4zyg^mPxDadipwq&4x>HN>cd+agl`nPe}c8QVMd2V;$#)& zu__ye>UQ5ZJp#q^VC#5~nzpnPMq}TJp~b`=)7NO&dsfV_-Xb9Pt(O=v-v0b`uT4pT zVy|iKO`?GJnO4{Fe+xOkzV5F@MAv+7TCJz$DB^`_xn?vIzLy_3(JRUbQ)H=%?uAx~ zPwoljKbDblRVa$jNGSqWL*sK{txer56r0uA_mfam>z(u%p=j2i#SMgFx3V&}s*1zv zwme7Boh!O(y{hARC{SV4J9Ro{~B9&7KpLPEB?;YjpF{~GB_*lAc(ex)Wg$75Cg?RBR$S0j}W>-<$3 zZ1{eUm44$@m)*o=p(fo-j5IQcS^tX{TdtK2eV zwYQ_vLQ`tOud6~~)Iy8y3dIqDzj`aV!iX&TW_yRxrieg$ulPnm@5iG`6_t5q(_vr}ZA#*3hKV|L=*9&6V~OdB3G3`m&n~Bg#_KZZfN2qN$Cz-aX}s1+$HNar3D40KO`%o0$Itp zr=-SJX4UzER96krLX)vJ;YRNW5iXPu;Hxbt+P-K|Pn7=mX^@8+h)AU$UNqqG`(sZN z8ebWJzhjvPVs~riL_F!h{2_LBVIG8n?#zR+y$`W5pxkH!%*~NHI>p>W$oCBKmFR0VZMP4(7?| zvzvJeKHtkc6+I6yCnNKF=4t45oOwDH|H3>2@1JF!iL?vMv(V`Zv0Sl3==Au!+6Nv( z6bRXSH$~F>Pr9jc*0f-SdmJFO$75DAz9)6bKdg2=PHI=hMymXU)O5Rz)GlX9 z?c%h>YRUqv@YpE8R9q}%qW~9TuGjWv%N7o?MJk`6Rfvr|@*$w4jXYe07Uh`J;CP2Q z9Zjn-OQ@wfG$)oVLu@)?ri9n+X#2frU>f7W}b>IU8%&GjGM!EzDnG^)_Y;mv<4%E%V5a>^g zOj2(gV>N39sq24Y_1YRzubpP~%k`wLJx{8#8>cSwB;O$InvHg54sPG#8@C6Q?{HYT z$otDipACDFUch$y(D@lV^DTTYnZLt(s!F^css1YQ0kqSZ58~6p%!kn0WIl|!q0C3n zstmDAD#CM2+v=*0HZf{-P0lM! z>fC0m#+#(ZwPJNnD5Ms4O{IA9FtN8v@tj7zzC6v>2QRYVq#<=spCt5@;G)h+Ae%{^1s#EOnJzPA; zGu+4Wi_CxF{8i=$SbBr`AIF+*lE zt&;HRgC@uZv04qq55r@%^Fr}Qd>k7FU{PB(bYf1&SB6RQX@AWr!@6jd6&HGR(e??& zjgnp2T9-8jXhE3JQ@cbt8@l(^ex{@iB>pCpKotH^`&cN2Fn6%lLMVmt(@<<271Y6P>4M9|)x=b|teOf`nOGSxqU1Nhw-An^GKK z&*%0~gf7&UQ8tF%X<7qKDT!wp?0PBOU9O!GN@*NkrF9jQk(FJeT@jR#Io4@k3ChU6 zUa!3nl#%V)q%{x47sWW)8`2(WLRtMFW1R10;g`VVWiw!K!(}(G()5Gi-2sR*7kiyHg(YNxwcoO z?5n)6(_D2C@37CHgcB#7_DMF%zS1lp4XrCwSPa}1gV+xKzmSU({Ym4y-_K7y79UgaQkJ_VlFZ*y# zr`Gmieh+{2We+>b<3p)aZX(an2?WzsTj!7>^5jr^5eyn-53?yPRGP0N5K*Vf2RVCf=M+%$wfO{ba-xCYd?CCb87b-2W z(=pK-12gS(`s2ij`?ZOSlzqqMByZ@g<|Puivg{PVVQl=r1;gSCU!ruFH*&Q6YZbdsl5El#4W|4+vqfT zraBHPbein5JDLePO&tD?aa8mn+3EP2syTzV z=`>kWja$gKnr~b3BdDb)3Po~D2=+uf_6j;zrqpLHj>?V6lFLZBy(t-n;&xMRD1pT- z*{~!M;+ac9YyWo01@Dn%X&iiyTgqV6`)pYjHM=pF!^K|A<+0)e<_d@(__k->ht#to z+=IBK5_S!H-SW2Vr1XBIBc9How2>V9yErwPO)DdLEDu@*jVCxxsY+FtQynoHoj(aP znX9AvT;>`Wv4EKlphe8#n7xF#CVG6%TnnFn!5o2))-gw7`zGevNcoC63P-_Q2dlne zj>eUJ%yqHrAagxD`+>PWPMlzFfWSQFhWO*0qbrwtjW4m^jWF#u_Pa5v{qbgfciy1b zo8ayZ?$8tm?(hK3V1LNm9Os`fw?OC%=2$!selc2LORwY2tC2drhL2!>&44o5H?=W{6nd7+oXK>B{apw~}M zp+gkJNVGgeon+iVYOH$HFI=NTruRvfb`B${X&y^S7?aOKe~i|bc&ag&|2y+o^t;JC z4r}f*kH>_E%oFg;>~A{A}|lo{TI%f8r^)>1Ljay@i;Qp_t6maJo42beLtB zXW&i+e+p$LT2}F=P-bCHHGc|a=Rt=DO>6oWe)Rz7M)*g{r$3OpYNY=mRUSV<&H2&( zVVd;hkyw|wm{ZZAC-Xv7>dX8YK1^ix zq2W;GMVLB@ISrl1FsDOKWR@73%)A(zXE86qj1=Y!97tu(L}nVtvlNdqIG$yQT*mSA zkMQ&0{!0I?LVg+TXJG4Uc6ee#Qa{P!FmjrbdU!Lb$||HHA-eTU2kbBHq(5-+u8)46w zw_?;w=C2T|22czZzVHudD8x1|t~vwO)B9g9Qau5=LhSIOec^y#RQb+k3LwG^pa2G0 z6hKmF0EHE^lhpV!tY+qrI*U0qgky_g=u z%3d$_H)Ca=7a6Ts`PPg4wyb>T#nz6bc=rGQ0a6>uFa3X1u=hL16Cn)0=+?|c*X`a5aI_f7LKP-Wo{vV58|c-6n_0E9ZU|0 z6vw=HkxU(BUU6#uZ59XUE#q&X%sdYJ&kCeIO=UH<3aNF{IqaXj5Scvf&t5cH!PEXi zsqq?CPI=LFJu7)$)Y!txX)i`@W95t&Eq1YT){9T}uyW3ep5L*O@5S=NtemIx^B60? zda>gtRxWrk?=&kHy*PHBl}lcHahXHBOuk>E5M}yAaxLygz%o@1NhXJ%{28!Sh^t;~ zxW^rS_aeD~hVWeb|JAL7k;VOJbyNHKJrOb^je36hl0z-Xpz*G$P73vg7hC+DH2qC4 z?&(e%?Uok@3$t?D3rA5_{`BJ4P*(1EQKBp>cfEL6k(GO1L{w$vz8B7LR{ruLzBVfl zyeLzTm4{yRZNy4}7j>Gm^2m$vajZP{qFp;Dh5CeI>Exul`P7SBU7U0`i{2w2S9f;? zy*f=w^>Rkat_A)&`t@=iR%MN6)LgfpGh7qTy%_!>jV4>D0R}n@W9_9EvqqDq{0H5} zI_W`Cuym4>9u$F5)0l0rW;3gpGmlxr_Y0ZrSdq@`z~xM4KVSv3Kc1{%4#1D=nVm4Q znO*pO8?ze~zGl|(&mQMT8l_Pq_dCI**gJ=uR1OAW-4Q31gN0D)sFUip!ZPfPGYAt; zIH_(6LXT6H!T$C1#R5Rp8__%Js;r??c)q|zC z_i`yV%ANYyTunH4TBErdbD4JC;i9+4<&o)fHPk3~$`5q)<}$5bkZUt%Ot(xIm4)xX zDB-GWqx2}QG`CmA#GvSsGO{d#Z_H%xjZWy?iw#BJ^H+stC67e=u)I>52r`V z>$=KOdL-#u1ZQJhlt9-sgXGG(uEOZv%oT2}xATFXP3C!_$>)7mpHa z+1J)sxxsbBMk&hL?Z@JeCO<_=)SKF#5i&a>DCGM}^Cgjht^5tzldH|1BDEs?u+}<}R<<`kT5u?(Z&wGX)y$ zBP#g(-7f{@V8>i;+6#&JG?2_F2eX3RR8%?wP)fTKxy~C@ zmLy8U)|YqFDh$Vvce(2bd{&*ijzn-RH&x@K(5tqaq8UwR7`K0f*hX#&Bnda0@zfvV zW-Pal!KT*SJ{CWB;P!Dy>cZ{gk<^u3vrQn+FDJT#5ZB9XXts&3un4?+>_b$_z%C}T zqm$8n2zxaJONY6sBBwh#k~taiquI-8(8uyD(5 zxx*2y#J<1Sc9o=SFrGgqTS~+R|KmPy6XQc<;6AN{^z73rZlAAHr9C0!%~x&KRM#~j z!!>=b*kMY;uD9cFs@*7N*Q*Hu6LEezeOJBH#A3Hj-;?h$5mZQ@ZxaVic^{6ZzL;Td z+2)1g-!ICGW9lPE7sWS4O!T!I?2JH_gJyaGmz+Y(z)s#WY#F88!8d)+^e4*@h~sB z8518R=>3H_Ya+j!u4($Y|M`MGIzoCfwF-zBrr)5X14@h@$$KEG znSN0fS4=s$mEK;a-nY9krj=fuk_!{-;&pn*@Vg1wUZ+9-Z}V?Ia=?}iMcXPKd&lZ+ z(;sz9h{++ol6^ycCHhuCy_0$i5isTL=EBO3n&;n-^esvi+5Uy2n!KH$7ZpF7GVy}m zSiV@MyD<8KURsD>Or&4Zotj*pNBF>$3+al~JpGX(9-8>%jJ}baGZC4uui@V-RFlVl z*NX|eS5~{GH+mI8u4Ip@CK;nlWIyRXwPFdmyY^njQ3 z3GL>mykt*Jq(0Y|*~H^uR9B3J!t*5f%_9<4JGxe_C`mtosEt%V{ULo<;Aa#PPlI9j z8?-5&1tZICw6}@lrfeN(wBxYcNC-6O0Xkt~PGN&?&PfwvO@n6o$;89rMutsXqzB05 zZih>yj2=Qj9QM}Pih~yCDw=sHaVuLB?cQo4hdVAc+pg)AzXySHfc5ai2fbQ(vW)rh| z8y#$7BAqSYD`lkTd!@2(-Nm2ei2=$oJ^>s1{g(Omm*6OjW*(@DPQi;=E@VT z^b!~`z+Q_Fiy7jUi8g}``joqE8glpnEqKR1Z3rdZCWal*VqZP)U6<+A7JlQDQ^p#_ z#99+e#~QTz*O@3k!Ju22Wn$D+c5S_hJ2MP=LS6*plTX;@WiSF$_$K_vyCaoND3zSJ z$Y`$0bBm1%^5|kimyZ@3gXN?pMseAP|J%OA2$T&o4X0eff8}P-UniFsk+N(C-3Px6 zqZqnn7=H8%l?*zHre_+VGBMK#kzZ#TMdjU0gTAZHG`#lk$mpm#HRMWG^D=25+frlQ Fe*ty!WLp3L diff --git a/integration-tests/validation/src/main/assets/figma/ComponentReplaceDoc_bQVVy2GSZJ8veYaJUrG6Ni.dcf b/integration-tests/validation/src/main/assets/figma/ComponentReplaceDoc_bQVVy2GSZJ8veYaJUrG6Ni.dcf index 832198f9b1b5f7f1b00e65f7f6c6d2926a85ab89..85a92a27c6cfd442b197b211c6bfee1ecaf37f3a 100644 GIT binary patch delta 202 zcmWN~OG-jv00m&r@z3WqFMnp#%}ki8zr~;5?i=vr$ymNKBHefp;WC3y`w{ zci<|722Fb@rr!p>xre!jmrHyv>Yu=m99|Q@8k#$UKUv{hVxvKHX0TP>?$RwJZM`M> z#7@PeNBnD<66rfpFWn`eb!J9T_t_!gS1c#OXqlf9M{1vriGV(wXCkPZ(u4@fI)5U< x8kc)SM4`%v?pZCa_v#~I$*FaSm`3#ngJao^!yK2}Tp8Hvv@Xc6v|g_U{yoK5KZO7Q delta 202 zcmWN|ze+-J00m&r@t0;^^Abd$K@egHfdz5JT%tvM0o}#T!L6oHqe)DZYlasGUqQ|j z_y#_O(9oKH(#-ke8+#ag=-%UJlKTc0O0i5V)i!m5m8{SUu~sWQH277*t`QscPkO{w z$y1N`)AUT_E~cm09(|gh4+*Go(I%+Kr3k;Ki4Vf4bhVEM`bxbM0X<*$iJ+|X8{Kf) y(&)BIgmien>R^LVq(nR>?*T@i7{vM dJ2{}f+|82}UolNI=&HlCxkQDT836E!D3JgF delta 139 zcmezF_uX%T&SZTh3C6@tQc;YPEoJy7Z%{tM&&B`&%Ecv#>8VK@t=}?E-owJP*@UTs zi7{pKUX~S1jH#Q`*q1OdrfuftI>f}7zWE%_L?*_J%?bRAm>4rRGYc(cV$9mSQsgib pWA^4;@kvaKIh&+_+HyDds)R9a{x9pt$e6d;PyQ9t=313sOaKblEkpnS diff --git a/integration-tests/validation/src/main/assets/figma/DialsGaugesTestDoc_lZj6E9GtIQQE4HNLpzgETw.dcf b/integration-tests/validation/src/main/assets/figma/DialsGaugesTestDoc_lZj6E9GtIQQE4HNLpzgETw.dcf index db96c42bba98e5ca95f929344a1fa2f012ef0e40..c93b995a1198d781423be9e85090137dff6ef8ad 100644 GIT binary patch delta 14186 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 PvD!>k>BpDVUUL5j*g5~& delta 3003 zcmb`Ie^66b7RTRB0!FB)fDu2>yNcnOM`u=6oQP7wWGDO-PyLgjJln=?ryt_KdCax-b56Z(%I=w z?##=(dEawC_ndRzIq&4_^A7dQeNMzMOgz1ULn@KVlUPZTRJMjyrODVdMQZnROJd_t zP^3RSz%W|~osVF@IyU{8{}QedY9Yp6b?md=+soztbBS@$(+ud!c1_U0e|!0rISZd) zuTf+WO+|+3!rmh~jXzfHn>Vw84*W-S!ud0y{l|+dE8QK^^Z}hbAUFLhj5g)DRQ@G!ikU`vu1~;G`n- zdeoAqk+f?jq@cW!=6y$i>k}i_oXOQ)PgeI4PM(a?B4?1Omv#Y4;r7arKVpJT!B3Y4 z>4bXO6$sh+sNFMMXBv7-5RC*>3pzm$n?1UyGWa(%cs$;dcaeEkiSK(@GV&D~yg9xP zJ}*Bsc)UAiX!u$r8S|_p!l6y%PTaR-^ULGV_g2l&VtYFo9lrv#caM>eKk6YVH$Ngw zdkjfoFNIRY=U&Q0F5dLLJ#ka^rrS>)^%GKQgb(g%Ebz_RjquYyQ~*2vb2$C0UqZQY zBit9i4f^O#IJxfwc&OR~#z&{2GSCZ$8w1eUdmheydj_s7xC-t&XW`7wf5YEh0}#Dz z3|zlC1!;zlGr&qtK`HK}XFUxb%hvhPto94V(yOdq33u=@t%j?S;Qq9m6}` ze+BNHxQQ?9k--{m3S`wrLs4`YsH;Wr_JucLU*gZ;i-Hr77psC7c3+0vh64Ef)vqAp zlTA?E`wf)455mr|QTQGI9F$&W$iLRz@W8Ey_h4`OfM0^meZFHYXD6(7023-=uA!DstRHF!ziU7Vay zn*NubC2-{2bZB%< zEihP^bm)k8U^tu8x>3AvvU$u<-rTx&lpZl7;c4ZUb19qAUBRTM6OE3ejm{J?y(oX+ zco^n9T>07ww=&tGxt-l`FnK#I?O>Z{7(O@8i(0-{-v1Zr_?zJ(iT9$TKh~#_iRcbY zjm}4-Tf}YJkG6#c$GvwL9S94_N0XJn?LLM&!-Jz4OW>3}$P)7-Uy2`0TLNb|i?)C7 zqw_!BjG1wvU=uHf3l|DD@EO__p4?II7ID5W(a!MTsCSFDXs#l9@i@&@ex!K5Tp?xE zsdA}WO=n7}QhCBGsN$iQe4p|JB@wJzt(N#Cd_l6u?y~D_Elpazq?u(^D%@mht8UFO zHyM%~^^R1l!&%W(qtKUR6qOk_*em3YoP1)mR+P&fmdp|fF34I{oo!U7u5QVzYc=Pr zYR+}$WjKhGNL_AOMoyzyuC2jUWR0sP%har@ENQdY^Xl-bOmk7AsXouDBc5!DMOLQ; znZcCVR&OfIY;_w9w(PPJy(y>ARA?xxcIU1x(kIo}R@<7&GmM}r&UX|_T5Q!iXQjEe zK%dmG+GMuraaFCYqR!1aEvw4SPRuH_@*;JC+5jc`dTVNtwXoRUg5A~f#(Iant*Y6T z)mCLC^;%WY`m&rdyTaO#-(atknT**r#zw5js;Sc&p-I`6m7!|XXR}J>2DLMPLuE@+ wS%HBlORP9MN#@M0XjVAtB#l+tT!&RA*R@(xRjFCl^_6U4tBvdC352}=0ChnEEC2ui diff --git a/integration-tests/validation/src/main/assets/figma/FancyFillTestDoc_xQ9cunHt8VUm6xqJJ2Pjb2.dcf b/integration-tests/validation/src/main/assets/figma/FancyFillTestDoc_xQ9cunHt8VUm6xqJJ2Pjb2.dcf index ecc7b2caf937af2bdc82a39abff580c630bce578..0cc8038caa5b72dc41ab0e07f3be148938c503e3 100644 GIT binary patch delta 145 zcmZ4aon_^BmJK}5xBoL|Jjl4+T#zwbV!Ag!qxR+vRRC??GGH`->+4~h{?wS!VDf}8)9pYl m9~mJUPiQeFGfsbC%4iPJv)__Y4X$Ss)krN`9oZ!)lWYIZWJUX0y#OHf((CASnmA zDB(Hr2e>Qk4^X>^n%K?3H#@x!&+F+`N=qp%g%RxBkG=xCv`JQw;kkMc>~W^yLa@(| z#z#Sx*VY+9j@9N{;DA@QXW)>b){4RrgY6Zi`jQ(6X16j>dP)JfRT$8HA;?h>%ZrLh~q7TY|ZK$;jo6KwN$AtAbBvPTkzPWd`@ z(&y4aPhKA_*3+130g`<2n`VlkKt}Ym*NzD1y&|&ye_+x#s}QY88~+kw{GMA;h}RmM kW<%SVh*ZGK-W>FMyh*EAfUD6b=)2`1=EFtsC;n#n13@ZtPyhe` delta 311 zcmXAjJxhXN7=<}^Pf22>H3afDNFR%fON&w#SW6Zm4nc-X(xB8my%$I=jvXt%Nfgspvd?3 z2hr0OD{pKQf<1nBUIQgw+Mj`a#=9E|2aNQZamZ=Ij50@E4W)yIjozWU(jzV#-R`<5z+ldjcOoo|rrnZ1HC?E802LFBwDU z!+kmzcI!ysNS9-6G=g2gCST@EGRydU(R>?nV3pC3h^+k$m$oHKL{y)E-Wi- n{5#U7LpvBvpF$5L2YH)#f_5fjTuD8GV?MK4Q&xUu-dcVEwhnQI diff --git a/integration-tests/validation/src/main/assets/figma/GridLayoutTestDoc_JOSOEvsrjvMqanyQa5OpNR.dcf b/integration-tests/validation/src/main/assets/figma/GridLayoutTestDoc_JOSOEvsrjvMqanyQa5OpNR.dcf index f923a59e214a06cca8f7cf35e4ed3de46d7c9326..fa6d66959bb6944e39c95c61d2da2a1d954fb99e 100644 GIT binary patch delta 1368 zcmYL{dr*~S5XRj-ANM%Nh_Hf$m|$u|P>Vy7NygMTG=<%8vI`*-83dRqmlaoT8iod;(1c(@Drtg}8VE88i0$iPrthEMGrRjfyZgRhR=#6azGHc} z2Cnpn)&=k&v28kn8$IWcP5F)Lo~E8k@?|tL|YTpyC)#pnJjml zye#8R0hBR)ss{E{>zsk;U?NYSDg;M;st>+QUQcWRbTU!JlWB@?I zS#vDqZPO?>bUs1>b-Z{}gI&}VCfH52;exN}z?*_^XwTb%J+%FO!MBtdEhwb59}Q_x zMDd>tX{PUtw*R{Z&(=R}1#e4#`2Bj02fRVAE_&8LvsXP1P)rf4!R4g?@UuX$>AP~r#SR6#a0gTRczxKGlZ7h2_yT>f?iGE zWB?<31uB_jFVZzwB((F`e5uo8TqHCeszM!nX`!;{~~r zS1QPRU1Ga5kcmUhdtd*vH+v;uZe2K=CRc-=o;iHN}d5bJ;${Yg|+= z)NRwi#3fZ~lpFkIjS3B9OK9s+3F()&iOgtJvP&1au2~h{ zyWG);hJ6~!+gxx!N!~T`X`=|3!c7mLOaNT}kRo#Bqc|~#XN5rn@JkU`k6gY8I}DuT zts;#}utc-;M4CAz8mmE%zYb=7d<8zmH`Zb%SO!MTeC>1GYoLMA2GH|Xp#LFH6jiz$ z1E?obRP)E^Z*|k%qcI@Y6U`hMi#5QbnRpEJu^7pVuaq8+#{gX#PqsL}9+!gd6OBH4 zc^jBHe3_im-REJTb%coo8G$7wNByGEUzaV+EYs}({rMyevQBb36Me1Id47Sus%alg e_IoBpQff%Po{rA4`8_M!G%35czQOyw#Qy-@bt}FA delta 1373 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 B-T(jq delta 3316 zcmZXVd0duN7RNj1-WL*q=f#@bnjjQZR6vC{DHONHeIFrn0Zm771DA12a0eGu>`iVX z;WD{orJz?miU_!qnVM!+?xVQCxTLtJ&bhv?eeyH>^F2KGIp_Y)@00qBa658r6eiahh>DF&B z+Uuq@869-P07ge07{utLtA;Q-Yws{d7Yz}NuKHe6MmJsFjL}`6Z^h`LPqbz9)CW5; z{;rFPv%IOCRl>$O(NljAHcD z_r@^#>+%VVczu2fBSD{-&KRH%rZEQUqWO%E^yW;)AiZu0W3XPfl<^PkT+SGx=d5B3 z)hX*Lq;I0-`HJhOQB-(@b60GH>Tm|V^v(@cZ7@uq(2Wp=YtOAw2qSdMZ5aq7_2GOL zI!edxWT8pguc(29WZitvT?wOgL31J!iZG2L?Jy5vIu%!e zIS4bT{a;`Qz)Z4Lg%Am|D7+@zkuaNT2N$#PI?EHIdWGX2ojoGhe*PUd70ZR~ECNo!&a7gKg0!%rwP0S4N@Np}WA z7{aGiYbZ2ESVFPGU<5)I?HK_x5frsef~^3b(bHtuE8t(WXPjwqDQ%x*m`%B6ih6x*xSBfV8SB>2k}bdk zT}uZDh9P`Ojq_nP!aCYk0NVh*qS1v$&)4MGZSuaM1_un+Q{W-P4OHz1!(8(H$uN)P zDZ`EQ=$zpux^>A=)8%W1o9Xlo!!2~|j^S1+d0-Zn_m@xQ8x>81ALh zVTSwYScKtzDv2^YK!wc>OK5Xz!*A)Uc7_LOMQ3E6zN4}p7>RI*0(u!8-_x2n!^70z zL!;*imG&`uj?#vB&Ql%opfYV3gyj;B(b7ay>NsVNV&ab$rH{o5i6<;dnP`HaEE=0) zf|C{{&M?8x7R9HV;1`Q}WtiYsi#jeg!6}PcW|`o$Mek(eKpUR1D0>CYLOg5H+g~67 zp0nuJRro~Ud5eDe(!6}Zq9f}~@E?ozZ8E_{i*}F+E?Km(zyzfht=)x_Z5V8+gDAq) zwORsu`!T3WU&-)98s<-%>};VmKW>i>VSCQ0I%tuQsIeQk;n@_&VBE?o|w=6<0A$ zs=YVSPLAui5HZ}M;wZu2b|dP38*`-<DqVTXj>TIs?^>Dxx#ia;Z|RDu%e@<~hLwN{ACR1U#gi_F|}jM~c^II2|c48XvoN>38=oJu$mv>!Q9nDIMhhshkfq zDL{_2spMkmP&uz*1TCm0>w6IYE3V;1@6D6DfY#QL)opY>35$W2HkDUvs<#eu`d@p? zj#4KF^Bb*W@jHfaCHe6s!rK4D1?ipiAuKwy4o~ehU(BZT(RFNZa1$zx0_YMQS>}{ z0~A+vCtaPvNvg$Vh;*5-KaGnzyCykk`4^_Ygx!3<)2F9{o+%@H)GX=HNt0N0^|dVZ z>;R*BayIwImO7~0Lb)9j+wUOubUQeUa~))5ai%jl*g<(K`5A>jFx?E#VL4om+q>BX zxk~v0uEL>P+1*oeAgGYNGDz_)?uTAGOph^_&8>UJv4C?)CN=dWhtmqpDENW<-PHBm zitd`k=RFGfoHvcn*=P6p_(Ob7UH9@+vt<0*@iDC6#X@qkEY$sO-;Ht(5U(by?OMsk z@|SF7`C%pe;Q8XYM$SIF6PB+t!-?O`o)j;aOF+e)k?*+PEWa#+%|3IH{dQZBYdC7u zEgAgst_~LFsw;o?e0v$Ex;Dk@0f#(CuF~zC403H}uiISYr4NXgaRJzZ-4>tq2x;nf~5vV>kTd-^GWhtk>ytdI5e2r_$;{+$WjH*|OLznfA3$hOJ{uG1a^tyE9 yxa6?*Js#T&Co@1j@U{j0;YJ3~TNkA_x@J@B9^b%DUjZ{gZpY-hK2QE5oO>8IKXdD4 z+#KiH$+)@1BcE|HYn15Z7Vk5g|9BQNPCg+evDx2ezW|uAD6SABEwNcGww7_TPQo&l i$rF{tCM%{&P3BXPpDdCg!E9_OJo&w|)aJ0%7=8dY%rL$H diff --git a/integration-tests/validation/src/main/assets/figma/ImageUpdateTestDoc_oQw7kiy94fvdVouCYBC9T0.dcf b/integration-tests/validation/src/main/assets/figma/ImageUpdateTestDoc_oQw7kiy94fvdVouCYBC9T0.dcf index b4708bd756e2d5467a3adc6920a350853ed3cb93..52c62b3992841bc1e4b8c5c8cbb3e8ed5b8936e6 100644 GIT binary patch delta 91 zcmaE}oAJ$V#tjKPlVd|nH}^AlGj3j^_(6a20ePLx2|NkHo96_wGEOduFy4GLq>~Y@ dXtGX-AyEDR<7U1H6DEW(Q;a%Tm{}>d7673bA`$=q delta 95 zcmaE}oAJ$V#tjKPlkFo+H}`RLGj9H4zd&%ZfSu0f1fC6so96_wGH&i??q-}U8)i5; pfyZ=mNrds{D?y!%U>$KWJ&c?ABaE5gyvfWlYCx?A7@3t~YXJxABOCw# diff --git a/integration-tests/validation/src/main/assets/figma/InteractionTestDoc_8Zg9viyjYTnyN29pbkR1CE.dcf b/integration-tests/validation/src/main/assets/figma/InteractionTestDoc_8Zg9viyjYTnyN29pbkR1CE.dcf index 98d7c345b615df98b5a91466c1b44e574976fb12..79ff1ca79646396d54a303d2215d84585995564b 100644 GIT binary patch delta 3015 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 F_#etrF7p5Y delta 3010 zcmYLLd3?>s7VkMTw^=l~Au2(BS5y??StDwBR9jnOZzR-G@w`x5QQB%lgxc4*7_ml0 zEfL$0uYIkEs@RhjRTM?-OKlNv=JWpO{qOrd=Qnfad%kn#=4J%vW(3b}Ol>zc>BH1c zFXM4c?e#mZ6-*U%uFoS<(QBkz=lSJHs-)8b7cxcY8YK&)H)g6^mn<`ry@k^Qb#~|x z>0O`Z))Sl=>}@kQP=|+Kklyfgw=PjRi}|Lbw^ea5-*WWcYG)>h}7c$>=blo}z z-*L2G^g>n>H&US9^xhH4_Z*%4??ue_9bNYQ8U35a3xr!=pPnbxS4%{Y-jg=9TOif7 zOheR8pTZQXcPuK9R92^D>|s|_{f6&&bcy6z%#}R4$(Sk35gvVb>bB?~a zwkh*@M|-k&Fh%KKHzcqsQ!D~?)6FB9qV<+7FQnS#GRp1Vp28}|R|e{sU3a8v5n#BM z`%{=2>D+_d3?3>SZ53{z8m_7u6OnJz5c$(-hR_nwQ? zd(JIjnxhkbJH)h2JC{~6ZPy2{EMif=UU?kwr3Or4c;Qb|nH)?AAkDI2gEu|8&$T3G zACLa&&o#`x9zF8bbIE=lJ@lRt>hIDao&9hDkE)i5@KHnIOO$LEdz|4=iQzhf1TejmnM5xVI(lHlvwLtuXon zGRmETigyiy4rYqr1iAlcR+Y=8}EqMeaSSX zheuuRM-jNxkNUG}QXt$&7(m9k$&PBIOdxbHZDtycqo31U=06-H4yU@zR~^h7VU@V% zAp9#@$CQI(qbP|9h)TApojvN_7_-3LF*JzjV{}iYt-*8U(k{$O;ca6DdZ{ZJ7pS+s%a1!}FQ1g4jmw2{o6FM_|O z7m{AVwT)&l6~nv3;@6nD*I<6b1LpwwxtKhtdYGm$vj%wkRXj`V)%xbgOfJf69N zgM}?P)#WXUa3eC7&oO!7YR|?ebMdSL8=uTWYG*b^o{xbEY>ch&tQ(sSFTn9$Y&x8d zUWpbjMExW-4p@Xk{n>PUF){~RyaZ80ZG0(8jI?+e7JX&ns`_#x`{ZOE%d{MRDJDhj zT5YJi<2jqDCKgX*qhBq2KbgN_stsqFt)dQmX7hHY&#-?EKO-7|9dj)|5Si(=x_CymgE|1NCoP@xm_QOjfP0GFFHf0Kio#N|~ zrlM;h8zW7_AHVWlsj|N_DHkr`7*0?Hzl+_!7eG(*uP8!Y#Op zXVr}$!CcjYTcyMesitZXgexJ!T>Ow6qr#AKB96Jb2S0|1r;=-Uu)CsI!2B-{5+a1r zt{ft&h*nHHFsPb%PP7wA)rC2CabGj#VrvUymfbj0*HE+vSq+4jX)l^J5~k>VsMgFD zwI4ang=xnDY-%ZvGOfVqHsT4XE)PxTQ)9(>Nh{H_qfPw*w>pbp7p+2Zf+>SmLwzDn zNm_#epNcf5wJ1uoI19&z0>k&B2#y8;dNE_dXFTNJ1C2c~h(P9qM zW}Hj0SY!Qn7H>iGNur*MwqoRTv5(0g(X+%Oq7sNqGe=POT9`RmX}*z*0afW)5Da@$;#lfmo!n}OHI{0&qFi&4FzF#MbiArPndaKIYn5OMf z%OEtzsuqHKJ8Y?;NZoC5S#&*MzT*oHN*@ySS=}fl0+Ddo)W8=V6dVy|RCd6WpG8|X z6Sg2r65=1&jDGmzkw{_g@2JXEL_<}(BbQMfGiAG+r(y`x z19aA1c`$}_*j-XVMUF0Ve4Uk6SqnI+-Zt^pF50}Oa$MA53 z#rZfg%Hrebo^0_6)J>JQ6do*W$3 ze(0zUIfiYYW7$VIzs+jZ$x-Wf%6iD&DH}6&#?9UG68qGx-zX}&?o(9Cm2H`xVQ8K- zqwYCg{v?;OniWERszQ!*iTag2IJr-1=65}qc+j+4r5}@r)tG$gQN8nJ1uV&zYv_OQ CtugZe diff --git a/integration-tests/validation/src/main/assets/figma/LayoutReplacementTestDoc_dwk2GF7RiNvlbbAKPjqldx.dcf b/integration-tests/validation/src/main/assets/figma/LayoutReplacementTestDoc_dwk2GF7RiNvlbbAKPjqldx.dcf index 9f4cf8572cf9b95b282ad0396d3395b01b5651aa..b4a4297f951b3ea2e2084a3da4dab669e30cfa37 100644 GIT binary patch delta 167 zcmaEv|1y7q4ddpGw(d-f+cvi{F)=Z2-`v46g^6*;W?6P1wR7_(P9U{wvpbIjE936X z34)xgjC(d`i6t;GZk#+{J!rG6q%ITVrp*g=XMFfuSOumdp& SC?}`pm82G}-@L)Zk{JN-gEm9} delta 187 zcmaEv|1y7q4deQaw(d-fyEeBnF)=aj-rT`5g^6*`W?6P1wRiI-P9U{!vpbIjE93sn z34)xgj2ky+i6t;G?U0-NPC{|>TZvdE#+{qJrF)qs>naN|Zr<#m%)&JJzija4>8j^g zHqTe+V`AC{Ry+Bvgu&$Ls?w8l^|?3a=ytF$Zinb=GLf3RSVCyBt(++1flYGrnHUdl fUZBv+B*MtRz`zc~AfTL_npcuqv}yAO6H8_Q8}L3q diff --git a/integration-tests/validation/src/main/assets/figma/LayoutTestsDoc_Gv63fYTzpeH2ZtxP4go31E.dcf b/integration-tests/validation/src/main/assets/figma/LayoutTestsDoc_Gv63fYTzpeH2ZtxP4go31E.dcf index c3961590a2595f0afba301e1d0e94fc02343b043..50ee2f22c7939152cb650e6fb4e8bc7cac1b3d9b 100644 GIT binary patch delta 1047 zcmYMye@sQI2OWccE&0*)@a0?ucdt+Bo6Gr~Hxk4lS1(Xs6b2JQ_q5U$N z(o!?QlfLR7sDT*@I(^3;XUo84ZVlv8;03f$K!O2z%~n~GyTRsHcl{?CI=rk%H-+n}= zf92Poz74u3XH{&|5n{^odp_1drhNW@N|^F;rAp0|xmDYB=%yS#s?ui4O|>dRO{t$! zInI>j^(wSTq!W#lnWZwd%G!p7ut2|kY9Yi4Cpqj8O<)4(0rHZnv8EL z16`LVTX%+1kDS*L8)3bW@R;1zmu3rYZV#rU>N95_GA-9SH@}lasi4Dr)RzkBw40a(=Ea{TXYUGp z0Fj>q7j^R99IS`(|k5Sg!HGX2CibMYEP zd#*b4Jvg-H!-EJ@R9u8dlwZVrE-k7Wv2M_x&O%onJqBy-6 zlQg9@(~mbb(N=<|&}sOXKckT-jH8( z!{DWdF%Iazk1Z5-s;H?$w6!ZGon6)NYxK(l`hhX}3ScmJC6sUqt1nY^v1cKiGP$J$ zBKlcG$!}WU4;3{_)Goc_Envh5atg(He>6MJVVW)?`pC((nPcp={S>5q7YG9}QZWRt2&B(GH(zCw6`+Xj#L5UbJeJg<06G<k30*XlBIk?&oU2>U`iUraj=5jMdlz~4Og>%>GaJn1RG+42b z3W2Bi63ieFHk4m}w71!C#BvSl@}n)GWew?z|kf>+tOf0*zEF!ows4W z7-*Mixn&ytEk}0UBYGeQb~{7qnoKy{0P2@li()_n(*Mn3(4ah8a#W)s8Fu8fMwet) zc_C<6uB?1p!`Hg(d9PH%h%VPxD;(A3=qZKY=rX7Nh=y-<`E!%PFJl~*UT=85e0>0N}%4e#7RhNSoM>P6LHuh}>CUv2=!yy*6BT+it7l@{~ zrV}Ng>%5pz=1V_vTbHUu^a*-Q4qUGEw-bDPd`PXRWc4~GIt&Umqh7a4*Hp6g|4-f1 ziAg-RoPy^1t$2EM!ZWMu4Urr}alAH$l0Xeyw2U$=JiUreZ?C#d8ZSFRt&Sks6k)9HRktW80@sK_Nvc&^c1as6`yac?s!K)-NS z3o0QNPE!bK4Y7Ti976pxkezA=s^gj&Qt5ugU*00uW=!j%Z2VtO?4o8Iv0i>w{IMje zI~DC4sc=C=F@m{v3Wt0}YnR$CpFuH1=tjiho-STf=)IhsOE=;c;SZe)(s2s7uk*q! zD1|w?;c>Ao8=>&%;)86&@X2hXLeyr$L4Wd4CiX*|b0J*p*?}m!!4W&~F2qwWBb*vlGQ?q7G@W8ho-7ZvnoBY#%!2i#Z0jcX=Cr#v_k}^2i~w+Yuq$J+Sdt z-3ZsnpI=SKhoHF}w#7SaY*o UdlMHSnmvdV@j+^+jhI4d3PO1s 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 diff --git a/integration-tests/validation/src/main/assets/figma/MaskTestDoc_mEmdUVEIjvBBbV0kELPy37.dcf b/integration-tests/validation/src/main/assets/figma/MaskTestDoc_mEmdUVEIjvBBbV0kELPy37.dcf index ff233c347eacc3a278f12d86018c160dee5c851b..09ffea331db0cf9446fa7eaa93c73bfd9de9bc66 100644 GIT binary patch delta 21 dcmdnh$F!u6X~VOYNx^KBWqGwW>$LJQ0RUw#2j2hy delta 42 ucmZ3|$F!@DX~VM?VMYcZ021q*7#i+71KBeiCr?yYnry}^xLK@~j|l)0NDIpV diff --git a/integration-tests/validation/src/main/assets/figma/ModuleExampleDoc_hPEGkrF0LUqNYEZObXqjXZ.dcf b/integration-tests/validation/src/main/assets/figma/ModuleExampleDoc_hPEGkrF0LUqNYEZObXqjXZ.dcf index b7a39b63c6ecdba523435a5fb413dba7d4fa0341..94bfc282f0623d5ff5be2898b0d4ca216b54dc93 100644 GIT binary patch delta 453 zcmX|-J4l;h6oz?E+~miQg2AGAsrB+}OjOhujzRdQ zj$J!7yrZrnI0S@tPy{=R6gqe5$)`BI4`+BdJcXPTa&j8Mc)srsFhN(2O7Px<_WgX! zR*L!I_*uP`5>w&zbE#C}*yrb^lM=*C-YI9us~ETV)t41aGPK_(Lo@+7JgFfaG5JY)8rTTuJr`0mRs*KJc59f4-ct5W*%%Me9zvJ0*n_z?wtLhx( z)w<3Yzi+7Qt#Kt|j)E?|$&7sdRF;T zy^8~XfwWTG)Ep%#XBQuz)K2eLPd(4`?v>ASKFjApisnLJL<7+IsDuWEnbGjMQOy(+ zIcp_qHxo=l3KvQx4kKq>XAvvaV3sFXTw66<*f*HsFf;8ej_n%u_n(-?Mz>VLAv!DbmV8eS@Ht}P+$IaA^lfD8|2Uemo0*J)i7D{1j z7kcMqTOD_c9;Q}&EX$j1 zcvzL;#?_iU)+uyOi6cWt`NSbnuxK(=G#M_M>{2GFTTT94QjbDqvsc-qJ~dH3`z8MS Lj3}QXdHVAU7X*y! diff --git a/integration-tests/validation/src/main/assets/figma/OpenLinkTestDoc_r7m4tqyKv6y9DWcg7QBEDf.dcf b/integration-tests/validation/src/main/assets/figma/OpenLinkTestDoc_r7m4tqyKv6y9DWcg7QBEDf.dcf index ab506c049b905b88ae0e1f0d6966a463ea555b0f..3147400329c70e3dafb9d8f04b0f313f51662dde 100644 GIT binary patch delta 407 zcmXw#&nv@m7{@)&_Qhc{!#1-S+c0BhpZ#dxebZJnOZbLFv>dceIXEcg;39|BO3j{< za#n6yk8*Hva*_NAt|Xd2Kzz+S*XMb^->>IgdH{NWvJ1pXpQmlutZ(`op@=BmB`nq4 zD}bL>lqDG9V#|btqvncH;ctUZ!ho6D6`4$mO6{!Btr!`{qpKEGpQS}Pz)X)E-xGd+aR&r_Lm1UEm=6c9W-J-3bE<*M4Ng8_b8EFui@ z>hdYV5Pz&xP>-4+9cEL|O-b94mYYGa|CP~GFN31F8%Jj&HY{Qx5f6nEaUlyi7D_~8 I^p!jQ0kZ~j>Hq)$ delta 393 zcmXw#yGud=6vjIzZ%J5oFZs$>+S|<3%*Q1Z0<$PC6%iHU5NgmKG_+KMAOz;22%3e4 zhT;qj1vx~E2+jQm(qeys`KYrVzTfZTqYC6JP_Tjb%I+M{i>j{9`D9;!$`RdDx&~li z1;YXuIoG==ph+zD%iPd(3pgy&pd2Qxtk9s^%q8ho1!j&K)&#I{-jYJFa?Msnw2AcN z2y@+`7r@TFlg-ZvXQ#iB-aR_d@t5ZqMQE!3{i9o%^c1Ju2S|m8iRwN#I@=7YI}|P_ z%|QF(C-k`dK#i0dMmx;0CbQZ~#L>~N##;FU(bZ~94b4V7$fwaMfO#&(?h%GqS$aV_ zPe?Gs*NF)PH@~jlAOtUeb tZHZNMmW;tTMGY5CSps3Av%_S22MVO0rM|z3gCTz?v=H#K`4xCJkhc|mMbu)4KCT8Zj6(#1T9@%_|Tak(J=;kN9HB5}hHYW|& diff --git a/integration-tests/validation/src/main/assets/figma/ShadowsTestDoc_OqK58Y46IqP4wIgKCWys48.dcf b/integration-tests/validation/src/main/assets/figma/ShadowsTestDoc_OqK58Y46IqP4wIgKCWys48.dcf index 621fd352c454485d84ea6bf5944b857e1a3907d3..3d0fb5cab96dfff7b1f6d2abe8ecd4524783c26b 100644 GIT binary patch delta 31 ncmeyfhUd>3o(VeJV?Qxk$~S6k)nGLI)ILp+Y5O!m=4UJb;TsI8 delta 31 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 delta 6176 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 diff --git a/integration-tests/validation/src/main/assets/figma/StateCustomizationsDoc_POWyniB6moGRmhZTJyejwa.dcf b/integration-tests/validation/src/main/assets/figma/StateCustomizationsDoc_POWyniB6moGRmhZTJyejwa.dcf index 959381f4f4ac771e672a1619301a4daedd6d4a9c..ede59f6c32a6d19d80222b43ed9185762c866c88 100644 GIT binary patch delta 71 zcmcb+n(^r>#tn1WCI|4aZQjE6g&oW|!WYK^Voct`rm{In_#G3RGeN9WfAR(s;mulZ MnjBz8ge<7v$mlU1_6z;$)_d*0gkiqsy71yi6N7bWFNCguEzlZin9=~#s?1t00000 m0000nGCDFgk0FzxfgH2J!o&dqkh6xwUe<3v$mlU1_6n)$)_d*0gAKmsy71yg&~uXWFNCguEzlZhO-c`#s`xdt_!m< q!LJK6yO3bPgh-~s^)v-bpt0|5=Qe+Xv+0SL3_3St5Q46{lN aKLP;-vx*Pw0RaZHcM%l>0SB{<6nzG#W)i9Z delta 68 zcmV-K0K5N+Hi|ZoIspf0SvQ^6nzGzuM(;N diff --git a/integration-tests/validation/src/main/assets/figma/VariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf b/integration-tests/validation/src/main/assets/figma/VariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf index 3793efd9f1bfb3b4afc26913856aeb78e0339c59..32bacdaa692f6abdea0bb033df0718b49db05bff 100644 GIT binary patch delta 422 zcmYk!&r8#B9LMqApUVl30=!%|swKyg^-{|#J`5jG@|uMPkCrzy z&NC%%d2{bBjRhybC(U(Q-f=qiM@gPjE&UbnCu}@T*m4LTTEpx~^a=8AJ082P_xg_Q z&~!A!-EA#R_>~JXe>N&SedfHNW5nXdxhoznUK$e~yLeaFIe4|6Rb!6?Cs%eNIpJe* zG$}YSZV|VNr(g;}ZY^CC41M%+VsTiIyHJm*8ZU?5Kd+KTWWGdj@P0M^mO|2w+O&fQ zB}*NS!!gawe9l!!6vNYDOs0I8U$rHGc(;u^+wvoO&*IP3UXAac95`i5b%YQ#Vayl3 zNUz)f-3QhzeqA3_7%3k>sw;|twV-NCBEB3$p?n-amiOTIH%qw@+~{w_zRd{6H`D(B D0ePd6 delta 438 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 diff --git a/integration-tests/validation/src/main/assets/figma/VariantAsteriskTestDoc_gQeYHGCSaBE4zYSFpBrhre.dcf b/integration-tests/validation/src/main/assets/figma/VariantAsteriskTestDoc_gQeYHGCSaBE4zYSFpBrhre.dcf index ae6d6a1774a24729ef843590912536f3950ae95a..1989a50239ddce3e55b4dea04dbd9e91cbf81dee 100644 GIT binary patch delta 423 zcmYL_JxE(|6vcaP9$MlPeM4(#F}!Gt!Q|D%L@Cd@2qHSziU=86t3`zjowEpnyP)3s zQ9r8IkN9n#w+1XIPJ)Z5AQl}27cHH-6|B&|I`qPUI~+K_bCSnM9-}wN$$}z&9X0sC zlg+QKo?hw}HL(UN( z?8Mq-#HiHpO@2K3LrBS?N7)>?Y#JpV&$nsS$GW#vvb=wRHF;=G+~$+vCfRID zNK4e#_$s2y+m3$1SMG8rBvoN+m{!P>L^Jn+TUDJJX72(qC+D@IA*tF=5$5^Oli-%< zQ{HaO;-8sSvQwu+%*I{9g6gwJU~yvIE__m5r-@IRD`?rr`>_aHmd@{tms0OlYpzIj o>nY*0m~Co`5ozdn<$COTaDQRD{Qq0VJ@Gs~Q2HJ>`FA}1517oD3IG5A delta 485 zcmYk2Pe_w-9L9UTdq=fD+780ddfn@*IOeQ(b4AT0sFNKk5n+dr6&CE;q0vc*?j_$s zv*w?it-reUl;9;h30($8QqaL;bc*T{RM0O6)$jD>_xA-dMxs;4s%)O2g`3eUK!z%x$CqUeXwu-21}u5vu!32w3) zstHOw-~0xc(OT{Try~OvX8FG5yI_JFQBQPI!u&RJU9_|>D^DE_*=YvtpTH7##bz6q z*SZsO+tK!TAMN-rV48aqMs&d6smI)iEIZoldTerk096LMjMI8DA(M{o@9k4N9^~QP zufP<04y;Ic&hhPNyj1p}*}uk1>C3>p#>R@wXR;RVap+=6u%P3CBCGx8r);v!i7ajl z87#*&pJ`+3iFOP3jbK?&;npB6JTN%s1rK#2TKqGkFNcE@pQ4&?OYqgn5EvU?7d+y} zk=KGdtmUryaM$oy5Pdh=FSi`6=e8~D*~k%|vR9$IyTTkgR~L}6F~jw_ad*_$Vf_t} YO8*z=UwKH^3q6wZbh*%?UkWR~0i%$iaR2}S diff --git a/integration-tests/validation/src/main/assets/figma/VariantInteractionsTestDoc_WcsgoLR4aDRSkZHY29Qdhq.dcf b/integration-tests/validation/src/main/assets/figma/VariantInteractionsTestDoc_WcsgoLR4aDRSkZHY29Qdhq.dcf index 99807033f576f2434b8587bc8298ac1e5338acc5..d049b673ee83852b57816fb559fe2ef13bd00e2c 100644 GIT binary patch delta 763 zcmYL{ZAjBm6vlVX{tHo8X=&=vHd71=ataaig)OiY=NnNWgt|&fB$G^oKrqn4bSfNm zNI@U`5@?wnW|nPgrfJh@rM;-BAF`~}UO!n{*BN% zRl841_{KGa)!GS(>e5nhNJF|}Jq?w5Qe3f7H2x=VWT+IJ{OgiHT{#jD4oWPnAmgBl z7mh9f406^*3vL6MOy(~3>e`WH%E>!$&U7aGJ$vt60rqSNm@95}>U5YXs7ysI^&VVRdqRRvKJ2t0cDXVa#ObTg ztiPTtLAS_W6g{H&K35SBH|9yu!?8C-!Q*v_9MaS#K`&3V%pxpu_gx3#tjJ}5D6`d! zFupZ`gVU9re#A0FIuCJY_?4J!GU%{_$goq5T{+ClQB4oCws&5Zr_izD{*B3>_3Nz;_G7&y-voe6N&ZYaVAbjLtrY-5Fg2uQjo;f#8nAL!s1(S{&lP^g)8fIXRb{(eF~vKUzW~#`eex>8440j{hT!9+)Bhxx&~QH zg_;cAIl_~0?0Rs9Uixd{3orMzBdyuA@Ra}9)Cdz)y6+-8%5O>VOhnp>@SL0MAqgf$ zoU;gXe4;uE;T83!*Hc2BjsgZ1_a?3bhia}Pybkl?{GL2&H(SH+jyhD_Z!AY{cB}y` zus^j8;SI%m>p7uLu)SsXxHws4O9Lw5od{h_OEl(lh2edzDsF5klVF+82ig!beX3O1N3EqoF2+%5JPliDp>~cu3#u@hoAhZ_)8@h)i&MNIdsvgLJ7yM+vhd3sa zsW6Fo(1jE^630azHP)#R7;ei8F4&_HBB_t3Px(H#iPb}(^d@9v>K(eyB>9uz2=*F^WN|M-~Tl8I?cTD zV<|;1_|kU7K8&zHT%tyT53BC;`>}oS0JB~85hp#DgDg5b7&C{(MH^W~OqzOl4y+`6 z1S^mAV`sbqSbgJkdKJo!R5|wulW7=HQ>cit+$6N%#mA5@PW$}~w3O>kA&*$QfI!OD zMfZqiM4#(#&M}iIO@y?Wq#;L4uyCT)xFj73WtFKWaHh&Xgw79?ZkcLQE-xo(Uj5&}I3xoSuJ%~q4 zLn{%#dk5iTt`=Jh%f7D&`9qXls?~1*diic zenYHVgOP_B5JX*co@#(qE-=80ns?PbTzztr=!d-;y2(&){Hvk6Z0n2tWDL{IuQx=> zUURUB_#l7S&_kyBLxsKDG=e|c21~^NOeJ)7%0dZT( zlkl0W%upibNnsdEU%0x$uHBf-%4?UfC#J1@d{0y%*U_N^giqQ1ty5)*!4YoBYjrJk zscYGL>RSFkb!9r$KGck{?@)<^-HF5#qZFwbaz_+e zxYJ6VA@bH6n~3D)g*e1p*w8{`by5X5>+RK3-bqwF;rNKvi6o&pf&%bTgVr6I|M49RlL5?mt$u&`w2 z=#2+>(KFSM2_3NxtsT>Un8;0Mi%LTd#I95kAZKLb2O?jcN3VuWMy-Y~!B5U!i{nK3 zIv=+IHm+99a{30i6AI+4T$~_mhwe9%9$#Fl@KUH_rpMFBZHsfqK3Azt`X&~18rBr z#Q$m!KkBISlUEeRhvf<*&nFn=vm+=XXmaaOcoPg#8TMTb9xk(nr&NX9)!6fgX4$_4 z*~B*0S>%?psMXktdb3=90S^eRq_T_o1b?SFIFnR&T6l7eQvO1n7uKjdch)#smnPL1 z?9#BvH3CSNSFS^OK`)to3uZ!Zsrcq<=<^zFUkBPFgnnGrH;*^{gSX~=iP+Gg!P2K5 zCZNBoZvJXMyyf4G*he(LX@Kly0aD3t%Hk-rQvP=D}r q4+`Rw9UpcNisj^~eieF<7q54$b@n7b9^*;=`~y$wB$s*8X!;LJ?2M=Y delta 1847 zcmY*ZYfx2H7;Sx=3+Uxu9`X=Dyd23#3L>Z@D!vL06$MKYK`}LXNInV!4Id~X0aw)R zxO;%8`5aVWwz!jsv1Y`_0-y0}Db1f5+BZ$7aPj$oHQcN4WvSs*{1Rm3l3$#F(j6Teh#Hh}FO z8^tOUJ=iH{AJ*D7hm1Ol<@SGs$uxn;MHjKIHwi;|`3YD< zHSsP6d>}4{=NRZiomEFH5>*jPgAptGq?ibCA~@|=4KrooDp(0`abHg`b}G$}yFP+Z z9KC#-L}X?R@U~pkMQV1bhInCEQ$Z|ChVz^OFthtIXq(k6T4Xrk zV-ZlhiCEP-Z{&(I>l%R#qC7W}uuxQ1TPL`H*&$e^=-D#wbG zXAf&|l>VV8Avp2m3)sP8tBl;z0Js074bk8%Zd@xNzWy{^SzY5Wajfx(#?#KjECT|O zPwZjSK$h{unT>toNgwHKQwbTT|nYzCSbbO`bkr<9IHHTMpGjBG+t3zbSn?@*#B=gKr z935ncJ5>3E07O%O&MF%xsOz82wl-vPix;*t)AeY+yBvAwBi#eR>?(41UreUHU1pJo zeBnpjEl}y$W6eh5O9sG=!YsV(8m62Gf|`LqIp$|@`;I$?$Tb5nmk=uJRw&!?)L=}d z9J{vcJS-CORAMGprWrZYr0*>i!H%tAYc+vky2 zgu#cx61cMQd>J|!KL9T|Ik5vp(#t4#Py*aBLXJp)Kk=3}xQI)Kiiz(`M_(GL^Bd_3 z)%A3M5Fu}7ph@HRK`!#l3Tz;ZmQynE6Jae2PGhpwSLGBhdy3AhS!WyYD#AN*bPg

g$| zk0e$Vv05qU4H;RAQD80ZgZbqh@IfYbtG8!lckqgDRdKt|R?2A{dr76MCvV=1C|YmN zJ{7~+s)}MaPzD}=f$*9Pc#Q8g43ZDpP}$MeF9#<6urEBwU+1;gl%)46ZIbquE!8+k z7$dhIhYKN6s(8MmVQfb^CH3onS0vihlw)%Jf0F#q#E)RLaKeF?F>~b zSDto78Qn+crB_s|FRs{H^_0r>yEOQAI3B&^wd=M?nqAQ*+5gR`~K)SWU1WfIuJFSB*#n_XMwbw;Tb;hD$dS~3tu*KbT;+lc{ z_&tpRWsre}g0FBSe;)6s7KX13YkoDI-&&e2t)*?LAyg`XADN~vQHsG**ix_vEDf-a2x5FF%=|!YfL}{iN2c(c*8Vm0OW!AW(2_za|eQf zZ5CO8k#D4A3wqFK;U;&SpodKs{*-=FV2nh6y)N4FR`Zy{V}P9;$qpgJa;Fmn#BrCa zMUZ(q4=ob?8F6ywv<)GdpIm=|V4d~e6p+Hc@d{x;Ns=fc=c8Ss*K!_(Wj87}Rp5FdSE`IqF;2`I|Y8Ft%!NpdDL;R69jo{|hcS}fe zmlY0kuuFxg=Fi>p2su338;iJ41Lm+iXaJ`Uo2$d->98&xHeZJ=&|tAp&vSDmWPl<) z&tfgl5;f0eK@d}jshU>WFdZScuZ15M^#knE_3qa7rs;b3XnG-?Yuq+Lq9mCw)iesC ziOhQq4k)FmklLauq;c8IYctpWOW^8I&qcYM*H76I_VebMa|j2xy>$wqg1?;&nsm2G zzI;5cwS~95zW}^?Q+#?;PN+?(R8K1|s*O5mLMb9^)J|=RgG!^B6jbcQN(B`vW%NTy JqVv(y{{Uh2?=1iT delta 719 zcmX|-T}YE*6vubY^RAgrx2chB^HpcobZTnpGBY#Fq!45oF+bATmehucsqliRT}4J< z97v=O3JEC)t0UqF@`Ji-xAp2pbRT8iL{JyK?V%ocE*|**pWivZ1r`e|rduc$SHa7U z_;Z9}UVn8HY0jJpR$elvBc_|^o27)eEMp2}aLgJ&u<=SpCxV?_j)(vUU(5Cg$mFh< zE&*A*>g*7ZP1Z!1C)5T7cJPYl9#Y}FgJVVCkw%|5c);5v2vU6LO#V(=mU{uxFsc5QdCLFla%}qN z85H1W`^>rm2iaBr6rpx*{DFW&Jn<+X=>4+$c8dx*v>DW1eDWjgVr$QJq-Q=Kq>z24 zo2L9Xc%`%xV7siRChKWNy;>;7#934sa6%oYwPhn5CP!T3*}$?wms@Szdrm_*!kfWL zGv$VD?ChCA+kYwTL!k@NW88Y_CqNT7M*{+m^Xx!7!U_I5_}dK4{CRW{vr_+g8H$9Z zmQsEb3L=!T8a7rhXYJw|Drm$g