From 367262f49966c6cfbd4e591ab6c32cd5d3028cec Mon Sep 17 00:00:00 2001 From: yuliuse <13226860+yuliuse@user.noreply.gitee.com> Date: Wed, 7 Oct 2026 16:58:08 +0800 Subject: [PATCH 01/39] feat: add recorded CAD features for source converters Add signed offsets, affine transforms, draft, tapered and limited extrusions, and multi-section sweeps with strict graph replay. Support closed and periodic sketch B-splines and accurate rational-surface volume integration. --- .../skill/references/docs/api/draft_rsolid.md | 39 ++++ .../docs/api/extrude_taper_rsolid.md | 13 ++ .../docs/api/extrude_until_rsolid.md | 53 ++++++ .../references/docs/api/offset_rsolid.md | 15 ++ .../skill/references/docs/api/scale_rsolid.md | 11 ++ .../docs/api/sweep_multisection_rsolid.md | 12 ++ .../references/docs/api/transform_rsolid.md | 10 + src/simplecadapi/__init__.py | 11 ++ src/simplecadapi/kernel/ocp_properties.py | 6 +- src/simplecadapi/operators/__init__.py | 10 +- src/simplecadapi/operators/deformation.py | 167 ++++++++++++++++ src/simplecadapi/operators/draft.py | 83 ++++++++ .../operators/limited_extrusion.py | 180 ++++++++++++++++++ .../operators/section_features.py | 150 +++++++++++++++ src/simplecadapi/operators/sketch.py | 4 +- src/simplecadapi/recording/serializer.py | 86 +++++++++ src/simplecadapi/sketch.py | 21 +- .../sketch_solver/py_slvs_backend.py | 4 +- src/simplecadapi/topology/model.py | 7 + test/test_deformation_features.py | 64 +++++++ test/test_draft.py | 60 ++++++ test/test_limited_extrusion.py | 92 +++++++++ test/test_rational_volume_precision.py | 17 ++ test/test_section_features.py | 66 +++++++ test/test_sketch_closed_bspline.py | 58 ++++++ 25 files changed, 1223 insertions(+), 16 deletions(-) create mode 100644 docs/skill/references/docs/api/draft_rsolid.md create mode 100644 docs/skill/references/docs/api/extrude_taper_rsolid.md create mode 100644 docs/skill/references/docs/api/extrude_until_rsolid.md create mode 100644 docs/skill/references/docs/api/offset_rsolid.md create mode 100644 docs/skill/references/docs/api/scale_rsolid.md create mode 100644 docs/skill/references/docs/api/sweep_multisection_rsolid.md create mode 100644 docs/skill/references/docs/api/transform_rsolid.md create mode 100644 src/simplecadapi/operators/deformation.py create mode 100644 src/simplecadapi/operators/draft.py create mode 100644 src/simplecadapi/operators/limited_extrusion.py create mode 100644 src/simplecadapi/operators/section_features.py create mode 100644 test/test_deformation_features.py create mode 100644 test/test_draft.py create mode 100644 test/test_limited_extrusion.py create mode 100644 test/test_rational_volume_precision.py create mode 100644 test/test_section_features.py create mode 100644 test/test_sketch_closed_bspline.py diff --git a/docs/skill/references/docs/api/draft_rsolid.md b/docs/skill/references/docs/api/draft_rsolid.md new file mode 100644 index 00000000..3f08e272 --- /dev/null +++ b/docs/skill/references/docs/api/draft_rsolid.md @@ -0,0 +1,39 @@ +# draft_rsolid + +```python +def draft_rsolid( + solid: Solid, + faces_to_draft: Sequence[Face] | ShapeSelector, + angle: ScalarLike, + plane_origin: Sequence[float] = (0, 0, 0), + plane_normal: Sequence[float] = (0, 0, 1), +) -> Solid +``` + +*Source: operators/draft.py* + +Import with `from simplecadapi import draft_rsolid`. + +Apply a signed draft angle in degrees to selected planar, cylindrical, or +conical faces. The neutral plane retains its original section while the selected +faces lean toward or away from it. Its origin and normal use the current +coordinate system. The input solid is preserved, and the output must be one +valid solid. A zero angle records an unchanged result. + +```python +import simplecadapi as scad +from simplecadapi import ql + +body = scad.make_box_rsolid(10, 10, 10) +right = ql.faces().where(ql.prop("geom.normal.x", ">", 0.9)).exactly(1) +drafted = scad.draft_rsolid(body, right, angle=10) +``` + +Selections may be explicit faces from the body or a QL selector. Empty +selections, faces from another body, unsupported surface families, a zero plane +normal, and nonfinite parameters are rejected. The angle must be strictly +between -90 and 90 degrees. Kernel failures and invalid topology raise errors. + +The operation `make_draft_rsolid` records the body and selected faces as ordered +inputs. Parameters preserve the angle, neutral plane, and face selection nodes +for strict model JSON replay. diff --git a/docs/skill/references/docs/api/extrude_taper_rsolid.md b/docs/skill/references/docs/api/extrude_taper_rsolid.md new file mode 100644 index 00000000..c1422ecc --- /dev/null +++ b/docs/skill/references/docs/api/extrude_taper_rsolid.md @@ -0,0 +1,13 @@ +# extrude_taper_rsolid + +```python +def extrude_taper_rsolid(profile: Face, vector: Sequence[float], + taper: float, flip_inner: bool = True) -> Solid +``` + +Extrude a planar sketch face by a nonzero vector, in current coordinate-system +coordinates. The finite taper angle is in degrees and must lie strictly between +-90 and 90. Positive taper shrinks the outer section; inner loops taper in the +opposite direction when `flip_inner=True`. Uses an analytic draft prism where +applicable and exact offset sections with lofts otherwise. Raises on collapsed +loops or invalid topology. Records `make_extrude_taper_rsolid` for replay. diff --git a/docs/skill/references/docs/api/extrude_until_rsolid.md b/docs/skill/references/docs/api/extrude_until_rsolid.md new file mode 100644 index 00000000..dfa02468 --- /dev/null +++ b/docs/skill/references/docs/api/extrude_until_rsolid.md @@ -0,0 +1,53 @@ +# extrude_until_rsolid + +```python +def extrude_until_rsolid( + profile: Face, + target: Solid | Sequence[Solid], + direction: Sequence[float] = (0, 0, 1), + until: str = "NEXT", +) -> Solid +``` + +*Source: operators/limited_extrusion.py* + +Import with `from simplecadapi import extrude_until_rsolid`. + +Extrude a planar face until it reaches an actual boundary on one or more target +solids. Planar and curved termination surfaces are supported. The direction is +interpreted in the current coordinate system and normalized before construction. + +| Mode | Direction | Termination | +| --- | --- | --- | +| `NEXT` | Forward | Nearest intersecting target surface | +| `LAST` | Forward | Farthest intersecting target surface | +| `PREVIOUS` | Reverse | Nearest intersecting target surface | +| `FIRST` | Reverse | Farthest intersecting target surface | + +The implementation intersects a temporary prism with the target, obtains target +boundary faces from kernel history, sews the contact faces into surfaces, and +splits the prism on the selected surface. Bounding boxes only determine a +sufficient temporary prism length; they do not define the termination surface. +Side walls parallel to the direction do not join separate near and far limits. + +```python +import simplecadapi as scad + +profile = scad.make_rectangle_rface(2, 2) +ceiling = scad.make_box_rsolid(10, 10, 2, bottom_face_center=(0, 0, 5)) +near = scad.extrude_until_rsolid(profile, ceiling, until="NEXT") # Volume 20 +far = scad.extrude_until_rsolid(profile, ceiling, until="LAST") # Volume 28 + +sphere = scad.make_sphere_rsolid(5, center=(0, 0, 10)) +curved = scad.extrude_until_rsolid(profile, sphere) +``` + +Targets must cover the profile at the requested contact. Missing contact, +insufficient coverage, an invalid mode, a zero/nonfinite direction, and invalid +kernel output raise errors. An empty target sequence is rejected. A successful +result is one valid solid; inputs are preserved. + +The recorded operation is `make_extrude_until_rsolid`. Its ordered inputs are the +profile followed by every target solid. Parameters retain `direction`, `until`, +and `target_count`, so model JSON replay recomputes the boundary when a target +changes. No final BRep is embedded in the feature. diff --git a/docs/skill/references/docs/api/offset_rsolid.md b/docs/skill/references/docs/api/offset_rsolid.md new file mode 100644 index 00000000..7cb20429 --- /dev/null +++ b/docs/skill/references/docs/api/offset_rsolid.md @@ -0,0 +1,15 @@ +# offset_rsolid + +```python +def offset_rsolid(solid: Solid, amount: ScalarLike, + openings: Sequence[Face] | ShapeSelector = (), *, + tolerance: float = 1e-4, kind: str = "ARC") -> Solid +``` + +Positive `amount` offsets outward; negative offsets inward. The amount must +be finite and nonzero. QL-selected `openings` form an open shell. With no +openings, produce a closed offset solid. Join `kind` is `ARC` or +`INTERSECTION`. Invalid kernel results raise an error. Records a replayable +`make_offset_rsolid` node with explicit face selections; topology tag lineage +is conservatively partial. `shell_rsolid` retains its existing positive +inward wall-thickness contract. diff --git a/docs/skill/references/docs/api/scale_rsolid.md b/docs/skill/references/docs/api/scale_rsolid.md new file mode 100644 index 00000000..61c156bc --- /dev/null +++ b/docs/skill/references/docs/api/scale_rsolid.md @@ -0,0 +1,11 @@ +# scale_rsolid + +```python +def scale_rsolid(solid: Solid, factors: Sequence[float], center: Sequence[float] = (0, 0, 0)) -> Solid +``` + +Scale a solid along the current coordinate system's axes about `center`. +The three factors must be finite and nonzero. Uniform scaling preserves +analytic curves and surfaces; nonuniform scaling uses the CAD kernel's +general affine transform. The source stays unchanged. Records a replayable +`make_scale_rsolid` operation. Topology tag lineage is conservatively partial. diff --git a/docs/skill/references/docs/api/sweep_multisection_rsolid.md b/docs/skill/references/docs/api/sweep_multisection_rsolid.md new file mode 100644 index 00000000..4fc25630 --- /dev/null +++ b/docs/skill/references/docs/api/sweep_multisection_rsolid.md @@ -0,0 +1,12 @@ +# sweep_multisection_rsolid + +```python +def sweep_multisection_rsolid(profiles: Sequence[Face | Wire], path: Wire, + is_frenet: bool = False, binormal: Sequence[float] | Wire | None = None) -> Solid +``` + +Sweep through at least two ordered sections along a continuous path. Face +sections supply their outer wire, matching build123d's multi-section sweep +contract. Binormal is an optional direction or auxiliary spine. The kernel +must produce one valid solid. Every section and path is recorded as an input +of `make_sweep_multisection_rsolid`, so model JSON preserves the construction. diff --git a/docs/skill/references/docs/api/transform_rsolid.md b/docs/skill/references/docs/api/transform_rsolid.md new file mode 100644 index 00000000..fba928a7 --- /dev/null +++ b/docs/skill/references/docs/api/transform_rsolid.md @@ -0,0 +1,10 @@ +# transform_rsolid + +```python +def transform_rsolid(solid: Solid, matrix: Sequence[Sequence[float]]) -> Solid +``` + +Apply a finite nonsingular 4x4 affine matrix in the current coordinate system, +including shear, reflection and nonuniform scale. Reject perspective and +singular matrices. Input geometry stays unchanged. Records a replayable +`make_transform_rsolid` operation; topology tag lineage is partial. diff --git a/src/simplecadapi/__init__.py b/src/simplecadapi/__init__.py index 839f9a33..1e09ceed 100644 --- a/src/simplecadapi/__init__.py +++ b/src/simplecadapi/__init__.py @@ -69,6 +69,10 @@ get_current_cs, ) from .errors import SimpleCADError +from .operators.deformation import scale_rsolid, offset_rsolid, transform_rsolid +from .operators.section_features import extrude_taper_rsolid, sweep_multisection_rsolid +from .operators.limited_extrusion import extrude_until_rsolid +from .operators.draft import draft_rsolid from .params.expr import ( Const, DimensionTolerance, @@ -433,6 +437,13 @@ def notebook_id() -> str: __all__ = [ + "scale_rsolid", + "transform_rsolid", + "offset_rsolid", + "extrude_taper_rsolid", + "sweep_multisection_rsolid", + "extrude_until_rsolid", + "draft_rsolid", "exporter", # 核心类 "CoordinateSystem", diff --git a/src/simplecadapi/kernel/ocp_properties.py b/src/simplecadapi/kernel/ocp_properties.py index 941c6eba..1e14f543 100644 --- a/src/simplecadapi/kernel/ocp_properties.py +++ b/src/simplecadapi/kernel/ocp_properties.py @@ -107,7 +107,9 @@ def surface_area(face: TopoDS_Face) -> float: def volume(solid: TopoDS_Solid) -> float: props = GProp_GProps() - BRepGProp.VolumeProperties_s(solid, props) + # Integrate NURBS by knot spans. The fixed-order routine both loses + # precision on rational curves and can crash on affine transformed trims. + BRepGProp.VolumePropertiesGK_s(solid, props, 1e-9, True, True) return float(props.Mass()) @@ -146,7 +148,7 @@ def center_of_mass(shape: TopoDS_Shape) -> Vec3: if kind in (TopAbs_SOLID, TopAbs_COMPSOLID, TopAbs_COMPOUND): props = GProp_GProps() try: - BRepGProp.VolumeProperties_s(shape, props) + BRepGProp.VolumePropertiesGK_s(shape, props, 1e-9, True, True) point = _props_mass_point(props) if point is not None: return point diff --git a/src/simplecadapi/operators/__init__.py b/src/simplecadapi/operators/__init__.py index 9942bbba..4f3299d8 100644 --- a/src/simplecadapi/operators/__init__.py +++ b/src/simplecadapi/operators/__init__.py @@ -16,7 +16,7 @@ import sys as _sys from types import ModuleType as _ModuleType -from . import _support, geometry, transform, boolean, product, sketch, selection, features +from . import _support, geometry, transform, boolean, product, sketch, selection, features, deformation, section_features, limited_extrusion, draft from ._support import * from .geometry import * from .transform import * @@ -25,6 +25,10 @@ from .sketch import * from .selection import * from .features import * +from .deformation import * +from .section_features import * +from .limited_extrusion import * +from .draft import * _IMPLEMENTATION_MODULES = ( _support, @@ -35,6 +39,10 @@ sketch, selection, features, + deformation, + section_features, + limited_extrusion, + draft, ) __all__ = tuple( diff --git a/src/simplecadapi/operators/deformation.py b/src/simplecadapi/operators/deformation.py new file mode 100644 index 00000000..e56cc95c --- /dev/null +++ b/src/simplecadapi/operators/deformation.py @@ -0,0 +1,167 @@ +"""Recorded scaling and signed offsets for CAD source translation.""" +from __future__ import annotations + +import math +from typing import Sequence + +import numpy as np +from OCP.BRepBuilderAPI import BRepBuilderAPI_Copy, BRepBuilderAPI_GTransform, BRepBuilderAPI_Transform +from OCP.BRepCheck import BRepCheck_Analyzer +from OCP.BRepGProp import BRepGProp +from OCP.BRepOffsetAPI import BRepOffsetAPI_MakeThickSolid +from OCP.GeomAbs import GeomAbs_Arc, GeomAbs_Intersection +from OCP.GProp import GProp_GProps +from OCP.TopTools import TopTools_ListOfShape +from OCP.gp import gp_GTrsf, gp_Pnt, gp_Trsf + +from ._support import ( + Solid, Face, ShapeSelector, ScalarLike, evaluate_scalar, evaluate_value, + get_current_cs, solids_of, record_operation_if_active, + _attach_lineage_from_source, _current_context_metadata, + _ensure_geo_selection_node_ids, _resolve_selector_or_shapes, + _serialize_shape_refs, +) + + +def _finite_vector(value: Sequence[float], name: str) -> tuple[float, float, float]: + values = tuple(float(v) for v in evaluate_value(value)) + if len(values) != 3 or not all(math.isfinite(v) for v in values): + raise ValueError(f"{name} must contain three finite numbers") + return values + + +def _finish(source: Solid, wrapped, op: str, params: dict, inputs: list) -> Solid: + solids = solids_of(wrapped) + if len(solids) != 1: + raise ValueError(f"{op} must produce exactly one solid, got {len(solids)}") + result = Solid(solids[0]) + props = GProp_GProps() + BRepGProp.VolumePropertiesGK_s(result.wrapped, props, 1e-9, True, True) + if props.Mass() < 0: + result.wrapped.Reverse() + if not BRepCheck_Analyzer(result.wrapped).IsValid(): + raise ValueError(f"{op} produced invalid geometry") + result._metadata = source._metadata.copy() + # These builders do not yet provide a complete face-history channel. + _attach_lineage_from_source(source, result, derivation="continuation", op=op, coverage="partial") + record_operation_if_active(op=op, params=params, outputs=result, + input_shapes=inputs, context=_current_context_metadata()) + return result + + +def scale_rsolid( + solid: Solid, + factors: Sequence[float], + center: Sequence[float] = (0, 0, 0), +) -> Solid: + """Scale along current coordinate-system axes about an explicit center. + + Every factor must be finite and nonzero. A uniform scale preserves analytic + geometry; a nonuniform scale converts curves/surfaces where the kernel needs + it. The input is unchanged and this operation is recorded for graph replay. + """ + values = _finite_vector(factors, "factors") + center_value = _finite_vector(center, "center") + if any(v == 0 for v in values): + raise ValueError("scale factors must be nonzero") + cs = get_current_cs() + global_center = cs.transform_point(np.array(center_value)) + if values[0] == values[1] == values[2]: + transform = gp_Trsf() + transform.SetScale(gp_Pnt(*global_center), values[0]) + builder = BRepBuilderAPI_Transform(solid.wrapped, transform, True) + else: + basis = np.column_stack([cs.transform_vector(np.eye(3)[i]) for i in range(3)]) + matrix = basis @ np.diag(values) @ basis.T + translation = global_center - matrix @ global_center + transform = gp_GTrsf() + for row in range(3): + for col in range(3): + transform.SetValue(row + 1, col + 1, float(matrix[row, col])) + transform.SetValue(row + 1, 4, float(translation[row])) + # GTransform's copy flag copies topology, but can retain shared curve + # geometry from boolean/fillet history. Isolate that geometry first: + # otherwise OCCT 7.9 can produce invalid p-curves and crash its checker. + copied = BRepBuilderAPI_Copy(solid.wrapped, True, False).Shape() + builder = BRepBuilderAPI_GTransform(copied, transform, True) + builder.Build() + if not builder.IsDone(): + raise ValueError("kernel could not scale the solid") + return _finish(solid, builder.Shape(), "make_scale_rsolid", + {"factors": factors, "center": center}, [solid]) + + +def transform_rsolid(solid: Solid, matrix: Sequence[Sequence[float]]) -> Solid: + """Apply a finite nonsingular 4x4 affine matrix in the current frame. + + General affine transformations include shear and reflection. Perspective + matrices and singular maps cannot define a solid and are rejected. + """ + values = np.asarray(evaluate_value(matrix), dtype=float) + if values.shape != (4, 4) or not np.isfinite(values).all(): + raise ValueError("matrix must be a finite 4x4 affine matrix") + if not np.allclose(values[3], (0, 0, 0, 1), rtol=0, atol=1e-12): + raise ValueError("perspective transforms cannot define an affine solid") + if abs(float(np.linalg.det(values[:3, :3]))) < 1e-14: + raise ValueError("matrix must be nonsingular") + cs = get_current_cs() + basis = np.column_stack([cs.transform_vector(np.eye(3)[i]) for i in range(3)]) + origin = cs.transform_point(np.zeros(3)) + linear = basis @ values[:3, :3] @ basis.T + translation = origin + basis @ values[:3, 3] - linear @ origin + transform = gp_GTrsf() + for row in range(3): + for col in range(3): + transform.SetValue(row + 1, col + 1, float(linear[row, col])) + transform.SetValue(row + 1, 4, float(translation[row])) + copied = BRepBuilderAPI_Copy(solid.wrapped, True, False).Shape() + builder = BRepBuilderAPI_GTransform(copied, transform, True) + builder.Build() + if not builder.IsDone(): + raise ValueError("kernel could not transform the solid") + return _finish(solid, builder.Shape(), "make_transform_rsolid", {"matrix": matrix}, [solid]) + + +def offset_rsolid( + solid: Solid, + amount: ScalarLike, + openings: Sequence[Face] | ShapeSelector = (), + *, + tolerance: float = 1e-4, + kind: str = "ARC", +) -> Solid: + """Offset a solid outward (positive) or inward (negative). + + Selected openings form an open shell. Empty openings produce the closed + offset solid. This is distinct from shell_rsolid's positive inward wall + thickness, and supports both signs and ARC/INTERSECTION joins explicitly. + """ + distance = evaluate_scalar(amount) + if not math.isfinite(distance) or distance == 0: + raise ValueError("amount must be finite and nonzero") + if not math.isfinite(tolerance) or tolerance <= 0: + raise ValueError("tolerance must be finite and positive") + joins = {"ARC": GeomAbs_Arc, "INTERSECTION": GeomAbs_Intersection} + if kind not in joins: + raise ValueError("kind must be ARC or INTERSECTION") + faces = list(_resolve_selector_or_shapes(solid, openings)) + if any(not isinstance(face, Face) for face in faces): + raise ValueError("openings must select faces") + selected_ids = _ensure_geo_selection_node_ids(solid, faces) + face_list = TopTools_ListOfShape() + for face in faces: + face_list.Append(face.wrapped) + builder = BRepOffsetAPI_MakeThickSolid() + builder.MakeThickSolidByJoin(solid.wrapped, face_list, distance, tolerance, + Intersection=True, RemoveIntEdges=True, Join=joins[kind]) + builder.Build() + if not builder.IsDone(): + raise ValueError("kernel could not offset the solid") + params = {"amount": amount, "tolerance": tolerance, "kind": kind, + "removed_face_count": len(faces), "selected_faces": _serialize_shape_refs(faces)} + if selected_ids: + params["selected_face_node_ids"] = selected_ids + return _finish(solid, builder.Shape(), "make_offset_rsolid", params, [solid, *faces]) + + +__all__ = ("scale_rsolid", "offset_rsolid", "transform_rsolid") diff --git a/src/simplecadapi/operators/draft.py b/src/simplecadapi/operators/draft.py new file mode 100644 index 00000000..1b427779 --- /dev/null +++ b/src/simplecadapi/operators/draft.py @@ -0,0 +1,83 @@ +"""Draft selected analytic solid faces around a recorded neutral plane.""" +from __future__ import annotations + +import math +from typing import Sequence + +import numpy as np +from OCP.BRepAdaptor import BRepAdaptor_Surface +from OCP.BRepOffsetAPI import BRepOffsetAPI_DraftAngle +from OCP.GeomAbs import GeomAbs_Plane, GeomAbs_Cylinder, GeomAbs_Cone +from OCP.gp import gp_Dir, gp_Pln, gp_Pnt + +from ._support import ( + Face, Solid, ShapeSelector, ScalarLike, evaluate_scalar, get_current_cs, + _resolve_selector_or_shapes, _ensure_geo_selection_node_ids, _serialize_shape_refs, +) +from .deformation import _finish, _finite_vector + + +def draft_rsolid( + solid: Solid, + faces_to_draft: Sequence[Face] | ShapeSelector, + angle: ScalarLike, + plane_origin: Sequence[float] = (0, 0, 0), + plane_normal: Sequence[float] = (0, 0, 1), +) -> Solid: + """Draft planar, cylindrical or conical faces by a signed angle in degrees. + + The neutral plane fixes the unchanged section. Its origin and normal are in + current coordinate-system coordinates. Face selection is checked against + the input body and retained as graph inputs for strict replay. The original + solid is preserved. Other surface families are explicitly rejected. + """ + if not isinstance(solid, Solid): + raise TypeError("solid must be a Solid") + degrees = float(evaluate_scalar(angle)) + if not math.isfinite(degrees) or abs(degrees) >= 90: + raise ValueError("angle must be finite and strictly between -90 and 90 degrees") + origin = _finite_vector(plane_origin, "plane_origin") + normal = _finite_vector(plane_normal, "plane_normal") + cs = get_current_cs() + global_origin = cs.transform_point(np.asarray(origin)) + global_normal = cs.transform_vector(np.asarray(normal)) + magnitude = float(np.linalg.norm(global_normal)) + if magnitude <= 1e-14: + raise ValueError("plane_normal must be nonzero") + global_normal = global_normal / magnitude + selected = list(_resolve_selector_or_shapes(solid, faces_to_draft)) + if not selected: + raise ValueError("draft requires at least one selected face") + original_faces = solid._iter_faces() + for face in selected: + if not isinstance(face, Face): + raise ValueError("faces_to_draft must select only Face objects") + if not any(face.wrapped.IsSame(other.wrapped) for other in original_faces): + raise ValueError("selected draft faces must belong to the input solid") + if BRepAdaptor_Surface(face.wrapped).GetType() not in {GeomAbs_Plane, GeomAbs_Cylinder, GeomAbs_Cone}: + raise ValueError("draft supports only planar, cylindrical, and conical faces") + # Remove repeated references without changing the ordered face selection. + selected = list({face.topo_id: face for face in selected}.values()) + selected_ids = _ensure_geo_selection_node_ids(solid, selected) + if degrees == 0: + shape = solid.wrapped + else: + direction = gp_Dir(*global_normal) + plane = gp_Pln(gp_Pnt(*global_origin), direction) + builder = BRepOffsetAPI_DraftAngle(solid.wrapped) + for face in selected: + builder.Add(face.wrapped, direction, math.radians(degrees), plane, True) + if not builder.AddDone(): + raise ValueError("kernel could not add the requested draft angle to a selected face") + builder.Build() + if not builder.IsDone(): + raise ValueError("kernel could not build the drafted solid") + shape = builder.Shape() + params = {"angle": angle, "plane_origin": plane_origin, "plane_normal": plane_normal, + "selected_face_count": len(selected), "selected_faces": _serialize_shape_refs(selected)} + if selected_ids: + params["selected_face_node_ids"] = selected_ids + return _finish(solid, shape, "make_draft_rsolid", params, [solid, *selected]) + + +__all__ = ("draft_rsolid",) diff --git a/src/simplecadapi/operators/limited_extrusion.py b/src/simplecadapi/operators/limited_extrusion.py new file mode 100644 index 00000000..b6de8f27 --- /dev/null +++ b/src/simplecadapi/operators/limited_extrusion.py @@ -0,0 +1,180 @@ +"""Recorded extrusion terminated by a real target face or curved shell. + +The construction follows the surface-history approach used by build123d: +intersect a long prism, sew the affected target faces, order contact surfaces, +and split by the selected surface. Bounding boxes only bound the temporary +prism; they never define the termination surface. +""" +from __future__ import annotations + +import math +from typing import Sequence + +import numpy as np +from OCP.BRepAlgoAPI import BRepAlgoAPI_Common, BRepAlgoAPI_Splitter +from OCP.BRepBuilderAPI import BRepBuilderAPI_Sewing +from OCP.BRepCheck import BRepCheck_Analyzer +from OCP.BRepGProp import BRepGProp, BRepGProp_Face +from OCP.BRepPrimAPI import BRepPrimAPI_MakeHalfSpace, BRepPrimAPI_MakePrism +from OCP.BRepTools import BRepTools +from OCP.GProp import GProp_GProps +from OCP.TopAbs import TopAbs_COMPOUND, TopAbs_FACE, TopAbs_SHELL +from OCP.TopoDS import TopoDS, TopoDS_Iterator +from OCP.TopTools import TopTools_ListOfShape +from OCP.gp import gp_Pnt, gp_Vec + +from ..kernel.ocp_booleans import solids_of +from ..kernel.ocp_export import make_compound_always +from ..kernel.ocp_properties import bounding_box, center_of_mass, distance, volume +from ..kernel.ocp_topology import faces_of +from ._support import Face, Solid, evaluate_value, get_current_cs +from .deformation import _finish, _finite_vector + + +def _top_level(shape): + if shape.ShapeType() != TopAbs_COMPOUND: + return [shape] + output = [] + iterator = TopoDS_Iterator(shape) + while iterator.More(): + output.extend(_top_level(iterator.Value())) + iterator.Next() + return output + + +def _crosses_direction(face, axis): + """Ignore side walls tangent to the extrusion, including coincident walls.""" + u0, u1, v0, v1 = BRepTools.UVBounds_s(face) + properties = BRepGProp_Face(face) + for u in (.25, .5, .75): + for v in (.25, .5, .75): + point, normal = gp_Pnt(), gp_Vec() + properties.Normal(u0 + u * (u1-u0), v0 + v * (v1-v0), point, normal) + length = normal.Magnitude() + if length > 1e-14 and abs(normal.X()*axis[0] + normal.Y()*axis[1] + normal.Z()*axis[2]) / length > 1e-8: + return True + return False + + +def _contact_surfaces(target, prism, axis): + common = BRepAlgoAPI_Common(target, prism) + common.Build() + if not common.IsDone() or not faces_of(common.Shape()): + raise ValueError("No intersection: extrusion does not contact target") + history = common.History() + modified = [] + intersection_faces = faces_of(common.Shape()) + for face in faces_of(target): + affected = list(history.Modified(face)) + if affected: + modified.extend(TopoDS.Face_s(item) for item in affected if item.ShapeType() == TopAbs_FACE) + elif not history.IsRemoved(face) and any(item.IsSame(face) for item in intersection_faces): + # A whole target may lie inside the temporary prism, in which case + # unchanged boundary faces are still genuine contact surfaces. + modified.append(face) + if not modified: + raise ValueError("No target boundary surfaces found in extrusion intersection") + sewing = BRepBuilderAPI_Sewing(1e-6) + for face in modified: + if _crosses_direction(face, axis): + sewing.Add(face) + sewing.Perform() + surfaces = _top_level(sewing.SewedShape()) + if not surfaces or any(part.ShapeType() not in {TopAbs_FACE, TopAbs_SHELL} for part in surfaces): + raise ValueError("Kernel could not sew target contact surfaces") + return surfaces + + +def _split_on_surface(prism, surface, keep_top): + arguments, tools = TopTools_ListOfShape(), TopTools_ListOfShape() + arguments.Append(prism) + tools.Append(surface) + splitter = BRepAlgoAPI_Splitter() + splitter.SetArguments(arguments) + splitter.SetTools(tools) + splitter.Build() + if not splitter.IsDone(): + raise ValueError("Kernel could not split extrusion on target surface") + reference_face = TopoDS.Face_s(surface) if surface.ShapeType() == TopAbs_FACE else faces_of(surface)[0] + u0, u1, v0, v1 = BRepTools.UVBounds_s(reference_face) + point, normal = gp_Pnt(), gp_Vec() + BRepGProp_Face(reference_face).Normal((u0+u1)/2, (v0+v1)/2, point, normal) + if normal.Magnitude() <= 1e-14: + raise ValueError("Undefined normal on termination surface") + normal.Normalize() + reference = point.Translated(normal) + if surface.ShapeType() == TopAbs_FACE: + halfspace = BRepPrimAPI_MakeHalfSpace(TopoDS.Face_s(surface), reference).Solid() + else: + halfspace = BRepPrimAPI_MakeHalfSpace(TopoDS.Shell_s(surface), reference).Solid() + candidates = [] + for part in solids_of(splitter.Shape()): + common = BRepAlgoAPI_Common(part, halfspace) + common.Build() + if not common.IsDone(): + raise ValueError("Kernel could not classify the termination side") + properties = GProp_GProps() + BRepGProp.LinearProperties_s(common.Shape(), properties) + is_top = properties.Mass() >= 1e-6 + if is_top == keep_top: + candidates.append(part) + return candidates + + +def extrude_until_rsolid( + profile: Face, + target: Solid | Sequence[Solid], + direction: Sequence[float] = (0, 0, 1), + until: str = "NEXT", +) -> Solid: + """Extrude a planar face until a target surface, including curved surfaces. + + NEXT and LAST select the nearest and farthest forward contact. PREVIOUS + and FIRST reverse the direction and select the nearest and farthest contact + behind the profile. Target surfaces must cover the profile at the contact; + an uncovered/open or disconnected output is rejected. Every target remains + a graph input, so changes to target geometry replay this feature correctly. + """ + if not isinstance(profile, Face): + raise TypeError("profile must be a Face") + targets = [target] if isinstance(target, Solid) else list(target) + if not targets: + raise ValueError("target must contain at least one Solid") + if any(not isinstance(item, Solid) for item in targets): + raise TypeError("target must be a Solid or a sequence of Solid") + mode = str(getattr(until, "name", until)).upper() + if mode not in {"NEXT", "LAST", "PREVIOUS", "FIRST"}: + raise ValueError("until must be NEXT, LAST, PREVIOUS, or FIRST") + values = _finite_vector(direction, "direction") + global_direction = get_current_cs().transform_vector(np.asarray(values)) + magnitude = float(np.linalg.norm(global_direction)) + if not math.isfinite(magnitude) or magnitude <= 1e-14: + raise ValueError("direction must be a finite nonzero vector") + axis = global_direction / magnitude + if mode in {"PREVIOUS", "FIRST"}: + axis = -axis + bound_target = make_compound_always([item.wrapped for item in targets]) + box = bounding_box(make_compound_always([profile.wrapped, bound_target])) + length = math.sqrt((box.xmax-box.xmin)**2 + (box.ymax-box.ymin)**2 + (box.zmax-box.zmin)**2) + if length <= 1e-12: + raise ValueError("Degenerate profile and target bounds") + prism = BRepPrimAPI_MakePrism(profile.wrapped, gp_Vec(*(axis * length))).Shape() + surfaces = sorted(_contact_surfaces(bound_target, prism, axis), key=lambda part: distance(part, profile.wrapped)) + nearest = mode in {"NEXT", "PREVIOUS"} + surface = surfaces[0] if nearest else surfaces[-1] + candidates = _split_on_surface(prism, surface, keep_top=nearest) + if not candidates: + raise ValueError("Extrusion produced no solid on the requested side of the target") + origin = np.asarray(tuple(center_of_mass(profile.wrapped))) + chosen = min(candidates, key=lambda part: np.dot(np.asarray(tuple(center_of_mass(part))) - origin, axis)) + if abs(volume(chosen) - volume(prism)) <= max(1e-8, abs(volume(prism))*1e-9): + raise ValueError("Target termination surface does not completely cover the extrusion profile") + if volume(chosen) <= 1e-12 or not BRepCheck_Analyzer(chosen).IsValid(): + raise ValueError("Target surface did not completely cover a valid limited extrusion") + result = _finish(profile, chosen, "make_extrude_until_rsolid", + {"direction": direction, "until": mode, "target_count": len(targets)}, [profile, *targets]) + result._apply_tag("solid.extrusion", propagate=False) + return result + + +__all__ = ("extrude_until_rsolid",) diff --git a/src/simplecadapi/operators/section_features.py b/src/simplecadapi/operators/section_features.py new file mode 100644 index 00000000..9292eea8 --- /dev/null +++ b/src/simplecadapi/operators/section_features.py @@ -0,0 +1,150 @@ +"""Recorded tapered extrusions and sweeps with multiple explicit sections.""" +from __future__ import annotations + +import math +from typing import Sequence + +import numpy as np +from OCP.BRepAdaptor import BRepAdaptor_Surface +from OCP.BRepAlgoAPI import BRepAlgoAPI_Cut +from OCP.BRepBuilderAPI import BRepBuilderAPI_Transform +from OCP.BRepOffsetAPI import BRepOffsetAPI_MakeOffset, BRepOffsetAPI_MakePipeShell, BRepOffsetAPI_ThruSections +from OCP.BRepPrimAPI import BRepPrimAPI_MakePrism +from OCP.BRepTools import BRepTools +from OCP.GeomAbs import GeomAbs_Intersection, GeomAbs_Plane +from OCP.LocOpe import LocOpe_DPrism +from OCP.TopAbs import TopAbs_WIRE +from OCP.TopExp import TopExp_Explorer +from OCP.TopoDS import TopoDS +from OCP.gp import gp_Dir, gp_Trsf, gp_Vec + +from ._support import Face, Wire, Solid, evaluate_scalar, get_current_cs +from .deformation import _finish, _finite_vector + + +def extrude_taper_rsolid( + profile: Face, + vector: Sequence[float], + taper: float, + flip_inner: bool = True, +) -> Solid: + """Extrude a planar face by a vector, with a taper in degrees. + + Positive taper shrinks the outer section. Inner loops optionally taper in + the opposite direction. Analytic draft prisms are retained where valid; + other orientations/holes use exact offset wire sections and solid lofts. + """ + values = _finite_vector(vector, "vector") + angle = float(evaluate_scalar(taper)) + if not math.isfinite(angle) or abs(angle) >= 90: + raise ValueError("taper must be finite and between -90 and 90 degrees") + displacement = get_current_cs().transform_vector(np.asarray(values)) + length = float(np.linalg.norm(displacement)) + if length <= 1e-12: + raise ValueError("extrusion vector must be nonzero") + surface = BRepAdaptor_Surface(profile.wrapped, True) + if surface.GetType() != GeomAbs_Plane: + raise ValueError("taper extrusion requires a planar profile") + normal = np.asarray(tuple(profile.get_normal_at()), dtype=float) + outer = BRepTools.OuterWire_s(profile.wrapped) + wires = [outer] + explorer = TopExp_Explorer(profile.wrapped, TopAbs_WIRE) + while explorer.More(): + wire = TopoDS.Wire_s(explorer.Current()) + if not wire.IsSame(outer): + wires.append(wire) + explorer.Next() + if angle == 0: + shape = BRepPrimAPI_MakePrism(profile.wrapped, gp_Vec(*displacement)).Shape() + elif np.linalg.norm(displacement / length - normal) < 1e-8 and normal[2] > 0 and len(wires) == 1 and angle > 0: + shape = LocOpe_DPrism(profile.wrapped, length / math.cos(math.radians(angle)), math.radians(angle)).Shape() + else: + # Offset in the profile plane before translating the final section. + move = gp_Trsf() + move.SetTranslation(gp_Vec(*displacement)) + solids = [] + for i, wire in enumerate(wires): + # Face inner wires wind opposite to the outer boundary. Normalize + # their winding before applying the signed 2-D offset so that + # flip_inner controls geometry rather than kernel wire orientation. + if i: + wire = TopoDS.Wire_s(wire.Reversed()) + offset = -length * math.tan(math.radians(angle)) * (-1 if i and flip_inner else 1) + builder = BRepOffsetAPI_MakeOffset(wire, GeomAbs_Intersection, False) + builder.Perform(offset) + if not builder.IsDone(): + raise ValueError("taper collapses a profile loop") + offset_shape = builder.Shape() + exp = TopExp_Explorer(offset_shape, TopAbs_WIRE) + found = [] + while exp.More(): + found.append(TopoDS.Wire_s(exp.Current())) + exp.Next() + if len(found) != 1: + raise ValueError("taper changes loop connectivity") + moved = BRepBuilderAPI_Transform(found[0], move, True).Shape() + loft = BRepOffsetAPI_ThruSections(True, False) + loft.AddWire(wire) + loft.AddWire(TopoDS.Wire_s(moved)) + loft.Build() + if not loft.IsDone(): + raise ValueError("kernel could not build tapered sections") + solids.append(loft.Shape()) + shape = solids[0] + for tool in solids[1:]: + cut = BRepAlgoAPI_Cut(shape, tool) + cut.Build() + if not cut.IsDone(): + raise ValueError("kernel could not subtract tapered inner loop") + shape = cut.Shape() + return _finish(profile, shape, "make_extrude_taper_rsolid", + {"vector": vector, "taper": taper, "flip_inner": flip_inner}, [profile]) + + +def sweep_multisection_rsolid( + profiles: Sequence[Face | Wire], + path: Wire, + is_frenet: bool = False, + binormal: Sequence[float] | Wire | None = None, +) -> Solid: + """Sweep through explicit ordered section wires along a continuous path. + + Face sections use their outer boundary, as in build123d's multi-section + pipe contract. Binormal may be a direction vector or auxiliary spine. + Each supplied section and path remains a graph input for replay. + """ + sections = list(profiles) + if len(sections) < 2: + raise ValueError("multi-section sweep requires at least two sections") + builder = BRepOffsetAPI_MakePipeShell(path.wrapped) + rotate = False + if isinstance(binormal, Wire): + builder.SetMode(binormal.wrapped, True) + elif binormal is not None: + values = _finite_vector(binormal, "binormal") + direction = get_current_cs().transform_vector(np.asarray(values)) + if np.linalg.norm(direction) < 1e-12: + raise ValueError("binormal direction must be nonzero") + builder.SetMode(gp_Dir(*direction)) + rotate = True + else: + builder.SetMode(bool(is_frenet)) + for section in sections: + if not isinstance(section, (Face, Wire)): + raise TypeError("sections must be Face or Wire") + wire = BRepTools.OuterWire_s(section.wrapped) if isinstance(section, Face) else section.wrapped + builder.Add(wire, False, rotate) + builder.Build() + if not builder.IsDone() or not builder.MakeSolid(): + raise ValueError("kernel could not make a solid multi-section sweep") + inputs = [*sections, path] + params = {"profile_count": len(sections), "is_frenet": bool(is_frenet), "binormal": None} + if isinstance(binormal, Wire): + inputs.append(binormal) + params["binormal_is_wire"] = True + elif binormal is not None: + params["binormal"] = binormal + return _finish(sections[0], builder.Shape(), "make_sweep_multisection_rsolid", params, inputs) + + +__all__ = ("extrude_taper_rsolid", "sweep_multisection_rsolid") diff --git a/src/simplecadapi/operators/sketch.py b/src/simplecadapi/operators/sketch.py index b70330bd..bf23c13d 100644 --- a/src/simplecadapi/operators/sketch.py +++ b/src/simplecadapi/operators/sketch.py @@ -326,7 +326,9 @@ def add_bspline_rsketch( """Add a B-spline curve entity to a sketch. The start/end point refs link the B-spline into a closed profile - loop. Control points may be literal 2-D coordinates or point refs. + loop. A closed curve may reuse one seam ref for both endpoints. + Control points may be literal 2-D coordinates or point refs. A periodic + seam links topology without replacing the periodic curve's poles. """ try: start_ref = _resolve_sketch_target(sketch, start, expected="point") diff --git a/src/simplecadapi/recording/serializer.py b/src/simplecadapi/recording/serializer.py index 94f0e2eb..b0f58472 100644 --- a/src/simplecadapi/recording/serializer.py +++ b/src/simplecadapi/recording/serializer.py @@ -421,6 +421,13 @@ }, "translate_shape": {"status": "replayable", "op": "make_translate_rshape"}, "rotate_shape": {"status": "replayable", "op": "make_rotate_rshape"}, + "scale_rsolid": {"status": "replayable", "op": "make_scale_rsolid"}, + "transform_rsolid": {"status": "replayable", "op": "make_transform_rsolid"}, + "offset_rsolid": {"status": "replayable", "op": "make_offset_rsolid"}, + "extrude_taper_rsolid": {"status": "replayable", "op": "make_extrude_taper_rsolid"}, + "sweep_multisection_rsolid": {"status": "replayable", "op": "make_sweep_multisection_rsolid"}, + "extrude_until_rsolid": {"status": "replayable", "op": "make_extrude_until_rsolid"}, + "draft_rsolid": {"status": "replayable", "op": "make_draft_rsolid"}, "mirror_shape": {"status": "replayable", "op": "make_mirror_rshape"}, "extrude_rsolid": {"status": "replayable", "op": "make_extrude_rsolid"}, "revolve_rsolid": {"status": "replayable", "op": "make_revolve_rsolid"}, @@ -597,6 +604,13 @@ "make_twisted_sweep_rsolid", "make_translate_rshape", "make_rotate_rshape", + "make_scale_rsolid", + "make_transform_rsolid", + "make_offset_rsolid", + "make_extrude_taper_rsolid", + "make_sweep_multisection_rsolid", + "make_extrude_until_rsolid", + "make_draft_rsolid", "make_mirror_rshape", "make_cut_rsolid", "make_union_rsolid", @@ -3895,6 +3909,78 @@ def _store_semantic_outputs(node, result: Any) -> None: _store_outputs(node, result) continue + if op_name == "make_draft_rsolid": + ctx.require_params(node.node_id, op_name, params, ("angle", "selected_face_count", "plane_origin", "plane_normal")) + values = _input_outputs(ctx, outputs, node, 0) + if values: + solid = values[0] + faces = _resolve_feature_selection(ctx, node=node, solid=solid, + params=params, kind="face", outputs=outputs) + if ctx.strict and len(faces) != params["selected_face_count"]: + ctx.fail(f"Graph node '{node.node_id}' expected {params['selected_face_count']} draft faces, got {len(faces)}") + result = ops.draft_rsolid(solid=solid, faces_to_draft=faces, angle=params["angle"], + plane_origin=params["plane_origin"], plane_normal=params["plane_normal"]) + _store_outputs(node, result) + continue + + if op_name == "make_extrude_until_rsolid": + ctx.require_params(node.node_id, op_name, params, ("direction", "until", "target_count")) + count = int(params["target_count"]) + values = [_input_outputs(ctx, outputs, node, i)[0] for i in range(count + 1)] + result = ops.extrude_until_rsolid(profile=values[0], target=values[1:], + direction=params["direction"], until=params["until"]) + _store_outputs(node, result) + continue + + if op_name == "make_extrude_taper_rsolid": + ctx.require_params(node.node_id, op_name, params, ("vector", "taper")) + input_values = _input_outputs(ctx, outputs, node, 0) + if input_values: + result = ops.extrude_taper_rsolid(profile=input_values[0], vector=params["vector"], + taper=params["taper"], flip_inner=params.get("flip_inner", True)) + _store_outputs(node, result) + continue + + if op_name == "make_sweep_multisection_rsolid": + ctx.require_params(node.node_id, op_name, params, ("profile_count", "is_frenet")) + count = int(params["profile_count"]) + values = [_input_outputs(ctx, outputs, node, i)[0] for i in range(count + 1)] + binormal = _input_outputs(ctx, outputs, node, count + 1)[0] if params.get("binormal_is_wire") else params.get("binormal") + result = ops.sweep_multisection_rsolid(profiles=values[:count], path=values[count], + is_frenet=params["is_frenet"], binormal=binormal) + _store_outputs(node, result) + continue + + if op_name == "make_transform_rsolid": + ctx.require_params(node.node_id, op_name, params, ("matrix",)) + inputs = _input_outputs(ctx, outputs, node, 0) + if inputs: + result = ops.transform_rsolid(solid=inputs[0], matrix=params["matrix"]) + _store_outputs(node, result) + continue + + if op_name == "make_scale_rsolid": + ctx.require_params(node.node_id, op_name, params, ("factors", "center")) + inputs = _input_outputs(ctx, outputs, node, 0) + if inputs: + result = ops.scale_rsolid(solid=inputs[0], factors=params["factors"], center=params["center"]) + _store_outputs(node, result) + continue + + if op_name == "make_offset_rsolid": + ctx.require_params(node.node_id, op_name, params, ("amount", "removed_face_count")) + inputs = _input_outputs(ctx, outputs, node, 0) + if inputs: + solid = inputs[0] + faces = _resolve_feature_selection(ctx, node=node, solid=solid, + params=params, kind="face", outputs=outputs) if params["removed_face_count"] else [] + if ctx.strict and len(faces) != params["removed_face_count"]: + ctx.fail(f"Graph node '{node.node_id}' expected {params['removed_face_count']} opening faces, got {len(faces)}") + result = ops.offset_rsolid(solid=solid, amount=params["amount"], openings=faces, + tolerance=params.get("tolerance", 1e-4), kind=params.get("kind", "ARC")) + _store_outputs(node, result) + continue + if op_name == "make_extrude_rsolid": ctx.require_params( node.node_id, op_name, params, ("direction", "distance") diff --git a/src/simplecadapi/sketch.py b/src/simplecadapi/sketch.py index 2cc907ba..4e7200d7 100644 --- a/src/simplecadapi/sketch.py +++ b/src/simplecadapi/sketch.py @@ -519,8 +519,10 @@ def add_bspline( """Add a B-spline whose poles participate in sketch solving. Control points may be literal 2-D coordinates or refs to points in - this sketch. The first and last poles always share the declared - start/end point entities. + this sketch. For nonperiodic curves the first and last poles share + the declared start/end point entities. A closed curve may use one + seam point for both endpoints; a periodic seam does not replace its + control poles, which generally lie away from the seam. """ from .operators.geometry import ( _normalize_bspline_knots, @@ -529,8 +531,6 @@ def add_bspline( start_id = self.resolve_point_id(start) end_id = self.resolve_point_id(end) - if start_id == end_id: - raise ValueError("A sketch bspline requires two distinct endpoint refs") if isinstance(degree, bool) or int(degree) != degree: raise ValueError("degree must be an integer") degree_value = int(degree) @@ -591,18 +591,19 @@ def resolved_control_point(point: Any) -> List[float]: end_entity = self.entities[end_id] start_point = [_as_float(start_entity.data["x"]), _as_float(start_entity.data["y"])] end_point = [_as_float(end_entity.data["x"]), _as_float(end_entity.data["y"])] - if isinstance(normalized_cps[0], Mapping): + if not periodic and isinstance(normalized_cps[0], Mapping): if normalized_cps[0]["point_id"] != start_id: raise ValueError("The first B-spline control-point ref must match start") - else: + elif not periodic: normalized_cps[0] = start_point - if isinstance(normalized_cps[-1], Mapping): + if not periodic and isinstance(normalized_cps[-1], Mapping): if normalized_cps[-1]["point_id"] != end_id: raise ValueError("The last B-spline control-point ref must match end") - else: + elif not periodic: normalized_cps[-1] = end_point - resolved_cps[0] = start_point - resolved_cps[-1] = end_point + if not periodic: + resolved_cps[0] = start_point + resolved_cps[-1] = end_point self._add_entity( SketchEntity( entity_id, diff --git a/src/simplecadapi/sketch_solver/py_slvs_backend.py b/src/simplecadapi/sketch_solver/py_slvs_backend.py index c364789f..1a7c6348 100644 --- a/src/simplecadapi/sketch_solver/py_slvs_backend.py +++ b/src/simplecadapi/sketch_solver/py_slvs_backend.py @@ -234,9 +234,9 @@ def _add_bspline_entity( if isinstance(point, Mapping) else None ) - if point_id is None and index == 0: + if point_id is None and index == 0 and not data.get("periodic", False): point_id = str(data["start"]) - elif point_id is None and index == len(raw_points) - 1: + elif point_id is None and index == len(raw_points) - 1 and not data.get("periodic", False): point_id = str(data["end"]) if point_id is not None: endpoint = self.point_handles[str(point_id)] diff --git a/src/simplecadapi/topology/model.py b/src/simplecadapi/topology/model.py index 65635103..c88e8b7b 100644 --- a/src/simplecadapi/topology/model.py +++ b/src/simplecadapi/topology/model.py @@ -648,6 +648,8 @@ def _node_display_category(op: str) -> str: "mirror", "make_translate_rshape", "make_rotate_rshape", + "make_scale_rsolid", + "make_transform_rsolid", "make_mirror_rshape", }: return "transform" @@ -664,6 +666,9 @@ def _node_display_category(op: str) -> str: "make_loft_rsolid", "make_sweep_rsolid", "make_twisted_sweep_rsolid", + "make_extrude_taper_rsolid", + "make_extrude_until_rsolid", + "make_sweep_multisection_rsolid", }: return "feature" if op in { @@ -673,6 +678,8 @@ def _node_display_category(op: str) -> str: "make_fillet_rsolid", "make_chamfer_rsolid", "make_shell_rsolid", + "make_offset_rsolid", + "make_draft_rsolid", }: return "detail" if op.startswith("make_"): diff --git a/test/test_deformation_features.py b/test/test_deformation_features.py new file mode 100644 index 00000000..8bb10622 --- /dev/null +++ b/test/test_deformation_features.py @@ -0,0 +1,64 @@ +"""Geometric and graph-replay contracts needed by source translators.""" +import math + +import pytest +import simplecadapi as scad + + +def test_nonuniform_scale_volume_and_replay(): + with scad.GraphSession(graph_id="scale-test") as session: + original = scad.make_box_rsolid(width=10, height=12, depth=14) + scaled = scad.scale_rsolid(solid=original, factors=(2, 3, 0.5), center=(5, 6, 7)) + session.capture_result(value=scaled) + assert scaled.get_volume() == pytest.approx(original.get_volume() * 3) + assert original.get_volume() == pytest.approx(1680) + rebuilt = scad.replay_model_json(scad.export_model_json(session=session), strict=True)[0] + assert rebuilt.get_volume() == pytest.approx(scaled.get_volume()) + + +@pytest.mark.parametrize("factors", [(0, 1, 1), (math.nan, 1, 1), (1, 2), (math.inf, 1, 1)]) +def test_invalid_scale_factors_are_rejected(factors): + original = scad.make_box_rsolid(width=10, height=12, depth=14) + with pytest.raises(ValueError): + scad.scale_rsolid(solid=original, factors=factors) + + +@pytest.mark.parametrize("amount", [-1.0, 1.0]) +def test_signed_open_shell_replays(amount): + with scad.GraphSession(graph_id="offset-test") as session: + original = scad.make_box_rsolid(width=10, height=12, depth=14) + openings = scad.ql.faces().where(scad.ql.prop("geom.normal.z", ">", 0.9)).exactly(1) + hollow = scad.offset_rsolid(solid=original, amount=amount, openings=openings) + session.capture_result(value=hollow) + assert 0 < hollow.get_volume() < original.get_volume() + rebuilt = scad.replay_model_json(scad.export_model_json(session=session), strict=True)[0] + assert rebuilt.get_volume() == pytest.approx(hollow.get_volume(), rel=1e-9) + + +def test_closed_outer_offset_increases_volume(): + original = scad.make_box_rsolid(width=10, height=12, depth=14) + expanded = scad.offset_rsolid(solid=original, amount=1.0) + assert expanded.get_volume() > original.get_volume() + + +def test_zero_offset_rejected(): + original = scad.make_box_rsolid(width=10, height=12, depth=14) + with pytest.raises(ValueError): + scad.offset_rsolid(solid=original, amount=0) + + +def test_affine_shear_is_recorded_and_replayed(): + with scad.GraphSession(graph_id="shear") as session: + original = scad.make_box_rsolid(width=10, height=12, depth=14) + transformed = scad.transform_rsolid(solid=original, + matrix=[[1, 0.3, 0, 5], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) + session.capture_result(value=transformed) + assert transformed.get_volume() == pytest.approx(original.get_volume()) + rebuilt = scad.replay_model_json(scad.export_model_json(session=session), strict=True)[0] + assert rebuilt.get_volume() == pytest.approx(transformed.get_volume()) + + +def test_affine_singular_matrix_rejected(): + original = scad.make_box_rsolid(width=10, height=12, depth=14) + with pytest.raises(ValueError): + scad.transform_rsolid(solid=original, matrix=[[0]*4 for _ in range(4)]) diff --git a/test/test_draft.py b/test/test_draft.py new file mode 100644 index 00000000..68ba2828 --- /dev/null +++ b/test/test_draft.py @@ -0,0 +1,60 @@ +"""Recorded draft preserves its selected faces and neutral-plane semantics.""" +import math + +import pytest +from OCP.BRepCheck import BRepCheck_Analyzer + +import simplecadapi as s +from simplecadapi import ql +from simplecadapi.operators.draft import draft_rsolid +from simplecadapi.recording.graph import GraphSession + + +def _right_face(body): + return next(face for face in body._iter_faces() if face.get_normal_at().x > .9) + + +@pytest.mark.parametrize("angle", [10, -10, 0]) +def test_single_planar_face_uses_neutral_plane_and_signed_degrees(angle): + body = s.make_box_rsolid(10, 10, 10) + result = draft_rsolid(body, [_right_face(body)], angle=angle) + assert result.get_volume() == pytest.approx(1000 - 500 * math.tan(math.radians(angle)), rel=1e-9) + assert body.get_volume() == pytest.approx(1000) + assert BRepCheck_Analyzer(result.wrapped).IsValid() + + +def test_query_selection_has_same_geometry_as_explicit_faces(): + body = s.make_box_rsolid(10, 10, 10) + selector = ql.faces().where(ql.prop("geom.normal.x", ">", .9)).exactly(1) + selected = draft_rsolid(body, selector, 5, plane_origin=(0, 0, 5)) + explicit = draft_rsolid(body, [_right_face(body)], 5, plane_origin=(0, 0, 5)) + assert selected.get_volume() == pytest.approx(explicit.get_volume(), rel=1e-9) + assert selected.get_volume() == pytest.approx(1000) + + +def test_draft_face_selection_and_plane_are_replayable(): + with GraphSession() as session: + body = s.make_box_rsolid(10, 10, 10) + result = draft_rsolid(body, [_right_face(body)], 10) + session.capture_result(value=result) + node = next(node for node in session.graph.nodes if node.op == "make_draft_rsolid") + assert node.params["angle"] == 10 + assert node.params["selected_face_count"] == 1 + assert len(node.params["selected_face_node_ids"]) == 1 + assert len(node.inputs) == 2 + replayed = s.replay_model_json(s.export_model_json(session))[0] + assert replayed.get_volume() == pytest.approx(result.get_volume(), rel=1e-9) + + +def test_invalid_selection_plane_and_angle_are_rejected(): + body = s.make_box_rsolid(10, 10, 10) + faces = [_right_face(body)] + other = s.make_box_rsolid(1, 1, 1, bottom_face_center=(20, 0, 0)) + with pytest.raises(ValueError, match="belong"): + draft_rsolid(body, [_right_face(other)], 5) + with pytest.raises(ValueError, match="at least one"): + draft_rsolid(body, [], 5) + with pytest.raises(ValueError, match="nonzero"): + draft_rsolid(body, faces, 5, plane_normal=(0, 0, 0)) + with pytest.raises(ValueError, match="angle"): + draft_rsolid(body, faces, 90) diff --git a/test/test_limited_extrusion.py b/test/test_limited_extrusion.py new file mode 100644 index 00000000..c5e648a3 --- /dev/null +++ b/test/test_limited_extrusion.py @@ -0,0 +1,92 @@ +"""Target-limited extrusions must terminate on actual target surfaces.""" +from __future__ import annotations + +import json +import pytest +from OCP.BRepAlgoAPI import BRepAlgoAPI_Cut + +import simplecadapi as s +from simplecadapi.kernel.ocp_booleans import solids_of +from simplecadapi.kernel.ocp_properties import center_of_mass, volume +from simplecadapi.operators.limited_extrusion import extrude_until_rsolid +from simplecadapi.recording.graph import GraphSession + + +@pytest.mark.parametrize("until,height", [("NEXT", 5), ("LAST", 7)]) +def test_forward_stops_at_near_or_far_planar_surface(until, height): + face = s.make_rectangle_rface(2, 2) + target = s.make_box_rsolid(10, 10, 2, bottom_face_center=(0, 0, 5)) + output = extrude_until_rsolid(face, target, until=until) + assert output.get_volume() == pytest.approx(4 * height) + + +@pytest.mark.parametrize("until,height", [("PREVIOUS", 8), ("FIRST", 10)]) +def test_reverse_modes_invert_the_direction(until, height): + face = s.make_rectangle_rface(2, 2, center=(0, 0, 10)) + target = s.make_box_rsolid(10, 10, 2) + output = extrude_until_rsolid(face, target, until=until) + assert output.get_volume() == pytest.approx(4 * height) + + +def test_curved_termination_matches_an_independent_boolean_reference(): + face = s.make_rectangle_rface(2, 2) + sphere = s.make_sphere_rsolid(5, center=(0, 0, 10)) + output = extrude_until_rsolid(face, sphere) + long_prism = s.extrude_rsolid(face, direction=(0, 0, 1), distance=20) + cut = BRepAlgoAPI_Cut(long_prism.wrapped, sphere.wrapped) + cut.Build() + candidates = solids_of(cut.Shape()) + lower = min(candidates, key=lambda part: center_of_mass(part).z) + assert output.get_volume() == pytest.approx(volume(lower), rel=1e-8) + # A sphere's contact surface bows away from its bounding box near the axis. + assert output.get_volume() > 4 * 5 + .1 + + +def test_ordered_multi_body_targets_choose_first_and_last_surface(): + face = s.make_rectangle_rface(2, 2) + lower = s.make_box_rsolid(10, 10, 2, bottom_face_center=(0, 0, 5)) + upper = s.make_box_rsolid(10, 10, 2, bottom_face_center=(0, 0, 10)) + assert extrude_until_rsolid(face, [upper, lower], until="NEXT").get_volume() == pytest.approx(20) + assert extrude_until_rsolid(face, [upper, lower], until="LAST").get_volume() == pytest.approx(48) + + +def test_rejects_invalid_parameters_and_non_intersecting_targets(): + face = s.make_rectangle_rface(2, 2) + far = s.make_box_rsolid(2, 2, 2, bottom_face_center=(20, 0, 5)) + with pytest.raises(ValueError, match="intersect|contact"): + extrude_until_rsolid(face, far) + with pytest.raises(ValueError, match="nonzero"): + extrude_until_rsolid(face, far, direction=(0, 0, 0)) + with pytest.raises(ValueError, match="NEXT"): + extrude_until_rsolid(face, far, until="UNKNOWN") + with pytest.raises(ValueError, match="at least one"): + extrude_until_rsolid(face, []) + + +def test_operation_retains_profile_and_target_as_replay_inputs(): + with GraphSession() as session: + face = s.make_rectangle_rface(2, 2) + target = s.make_box_rsolid(10, 10, 2, bottom_face_center=(0, 0, 5)) + output = extrude_until_rsolid(face, target) + session.capture_result(value=output) + node = next(n for n in session.graph.nodes if n.op == "make_extrude_until_rsolid") + assert len(node.inputs) == 2 + assert node.params == {"direction": (0, 0, 1), "until": "NEXT", "target_count": 1} + replayed = s.replay_model_json(s.export_model_json(session))[0] + assert replayed.get_volume() == pytest.approx(output.get_volume(), rel=1e-9) + assert replayed.get_volume() == pytest.approx(20) + + +@pytest.mark.parametrize("until,height", [("NEXT", 5), ("LAST", 7)]) +def test_matching_target_footprint_keeps_distinct_termination_faces(until, height): + profile = s.make_rectangle_rface(2, 2) + target = s.make_box_rsolid(2, 2, 2, bottom_face_center=(0, 0, 5)) + result = extrude_until_rsolid(profile, target, until=until) + assert result.get_volume() == pytest.approx(4 * height) + + +def test_partial_target_cannot_silently_leave_the_temporary_prism(): + profile = s.make_rectangle_rface(4, 4) + target = s.make_box_rsolid(2, 2, 2, bottom_face_center=(0, 0, 5)) + with pytest.raises(ValueError, match="cover|termination"): + extrude_until_rsolid(profile, target) diff --git a/test/test_rational_volume_precision.py b/test/test_rational_volume_precision.py new file mode 100644 index 00000000..86bc7634 --- /dev/null +++ b/test/test_rational_volume_precision.py @@ -0,0 +1,17 @@ +"""Rational NURBS mass properties must match analytic geometry.""" +import math + +import pytest +import simplecadapi as s + + +def test_nurbs_circle_extrusion_uses_span_aware_volume_integration(): + sketch = s.make_sketch_rsketch(name="rational-circle", plane="XY") + sketch = s.add_point_rsketch(sketch=sketch, point_id="seam", x=1, y=0) + poles = [(1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0), (-1, -1), (0, -1), (1, -1), (1, 0)] + sketch = s.add_bspline_rsketch(sketch=sketch, entity_id="circle", start="seam", end="seam", + control_points=poles, degree=2, knots=[0, .25, .5, .75, 1], + multiplicities=[3, 2, 2, 2, 3], weights=[1, math.sqrt(.5), 1, math.sqrt(.5), 1, math.sqrt(.5), 1, math.sqrt(.5), 1]) + profile = s.make_face_from_sketch_rface(sketch=sketch) + body = s.extrude_rsolid(profile=profile, direction=(0, 0, 1), distance=2) + assert body.get_volume() == pytest.approx(2 * math.pi, rel=1e-9) diff --git a/test/test_section_features.py b/test/test_section_features.py new file mode 100644 index 00000000..04cb22f2 --- /dev/null +++ b/test/test_section_features.py @@ -0,0 +1,66 @@ +"""Native section features: strict geometry and graph replay.""" +import math +import pytest +import simplecadapi as s + + +def _rectangle(z, width=10, height=6): + sketch = s.make_sketch_rsketch(name=f"section{z}", plane={"origin": (0, 0, z), "x_axis": (1, 0, 0), "y_axis": (0, 1, 0)}) + for name, point in zip("abcd", [(0, 0), (width, 0), (width, height), (0, height)]): + sketch = s.add_point_rsketch(sketch=sketch, point_id=name, x=point[0], y=point[1]) + for name, first, second in [("ab", "a", "b"), ("bc", "b", "c"), ("cd", "c", "d"), ("da", "d", "a")]: + sketch = s.add_line_rsketch(sketch=sketch, entity_id=name, start=first, end=second) + return s.make_face_from_sketch_rface(sketch=sketch) + + +def test_tapered_rectangle_and_graph_replay(): + with s.GraphSession(graph_id="taper") as session: + profile = _rectangle(0) + body = s.extrude_taper_rsolid(profile=profile, vector=(0, 0, 4), taper=10) + session.capture_result(value=body) + slope = math.tan(math.radians(10)) + expected = 60 * 4 - (10 + 6) * slope * 4**2 + 4 * slope**2 * 4**3 / 3 + assert body.get_volume() == pytest.approx(expected, rel=1e-8) + replayed = s.replay_model_json(s.export_model_json(session=session), strict=True)[0] + assert replayed.get_volume() == pytest.approx(expected, rel=1e-8) + + +def test_multisection_straight_sweep_and_replay(): + with s.GraphSession(graph_id="multi") as session: + sections = [_rectangle(0), _rectangle(3), _rectangle(6)] + path = s.make_segment_rwire(start=(5, 3, 0), end=(5, 3, 6)) + body = s.sweep_multisection_rsolid(profiles=sections, path=path) + session.capture_result(value=body) + assert body.get_volume() == pytest.approx(360, rel=1e-6) + replayed = s.replay_model_json(s.export_model_json(session=session), strict=True)[0] + assert replayed.get_volume() == pytest.approx(360, rel=1e-6) + + +def test_multisection_needs_two_sections(): + with pytest.raises(ValueError): + s.sweep_multisection_rsolid(profiles=[_rectangle(0)], path=s.make_segment_rwire(start=(0, 0, 0), end=(0, 0, 3))) + + +def test_invalid_taper_is_rejected(): + with pytest.raises(ValueError): + s.extrude_taper_rsolid(profile=_rectangle(0), vector=(0, 0, 4), taper=math.nan) + + +@pytest.mark.parametrize("taper,vector", [(-10, (0, 0, 4)), (10, (0, 0, -4))]) +def test_taper_fallback_keeps_exact_section_area(taper, vector): + body = s.extrude_taper_rsolid(profile=_rectangle(0), vector=vector, taper=taper) + slope = math.tan(math.radians(taper)) + expected = 60 * 4 - 16 * slope * 16 + 4 * slope**2 * 64 / 3 + assert body.get_volume() == pytest.approx(expected, rel=1e-7) + + +def test_taper_with_hole_tapers_inner_loop_oppositely(): + sketch = s.make_sketch_rsketch(name="annulus", plane="XY") + sketch = s.add_point_rsketch(sketch=sketch, point_id="center", x=0, y=0) + sketch = s.add_circle_rsketch(sketch=sketch, entity_id="outer", center="center", radius=10) + sketch = s.add_circle_rsketch(sketch=sketch, entity_id="inner", center="center", radius=2) + face = s.make_face_from_sketch_rface(sketch=sketch, profile="outer", inner_profiles=["inner"]) + body = s.extrude_taper_rsolid(profile=face, vector=(0, 0, 3), taper=5) + slope = math.tan(math.radians(5)) + expected = math.pi * ((100 - 4) * 3 - (10 + 2) * slope * 9) + assert body.get_volume() == pytest.approx(expected, rel=1e-6) diff --git a/test/test_sketch_closed_bspline.py b/test/test_sketch_closed_bspline.py new file mode 100644 index 00000000..cacb7d73 --- /dev/null +++ b/test/test_sketch_closed_bspline.py @@ -0,0 +1,58 @@ +"""Closed spline seams are topology endpoints, including periodic NURBS.""" +import math +import pytest +import simplecadapi as scad +from OCP.BRepGProp import BRepGProp +from OCP.GProp import GProp_GProps + + +def accurate_mass(shape, *, volume=False): + props = GProp_GProps() + if volume: + BRepGProp.VolumePropertiesGK_s(shape.wrapped, props, 1e-10, True, True) + else: + BRepGProp.SurfaceProperties_s(shape.wrapped, props, 1e-10) + return props.Mass() + + +def rational_circle(): + poles = [(1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0), (-1, -1), (0, -1), (1, -1), (1, 0)] + weights = [1, math.sqrt(.5), 1, math.sqrt(.5), 1, math.sqrt(.5), 1, math.sqrt(.5), 1] + return poles, weights + + +def test_closed_rational_bspline_same_endpoint_promotes_exact_face(): + poles, weights = rational_circle() + sketch = scad.make_sketch_rsketch(name='closed-rational') + sketch = scad.add_point_rsketch(sketch, 'seam', 1, 0) + sketch = scad.add_bspline_rsketch(sketch, 'boundary', 'seam', 'seam', poles, + degree=2, knots=[0, .25, .5, .75, 1], multiplicities=[3, 2, 2, 2, 3], weights=weights) + face = scad.make_face_from_sketch_rface(sketch=sketch) + assert accurate_mass(face) == pytest.approx(math.pi, rel=1e-9) + with scad.GraphSession() as session: + sketch2 = scad.make_sketch_rsketch(name='replayed-closed-rational') + sketch2 = scad.add_point_rsketch(sketch2, 'seam', 1, 0) + sketch2 = scad.add_bspline_rsketch(sketch2, 'boundary', 'seam', 'seam', poles, + degree=2, knots=[0, .25, .5, .75, 1], multiplicities=[3, 2, 2, 2, 3], weights=weights) + face2 = scad.make_face_from_sketch_rface(sketch=sketch2) + solid = scad.extrude_rsolid(face2, (0, 0, 1), 2) + session.capture_result(value=solid) + from simplecadapi.recording.serializer import replay_graph + rebuilt = replay_graph(session.graph) + assert accurate_mass(rebuilt[0], volume=True) == pytest.approx(math.pi * 2, rel=1e-9) + + +def test_periodic_bspline_seam_does_not_replace_control_poles(): + poles = [(2, 0), (0, 2), (-2, 0), (0, -2)] + # The seam lies midway between poles for this periodic quadratic basis. + native = scad.make_spline_redge(control_points=[(x, y, 0) for x, y in poles], degree=2, periodic=True) + from OCP.BRepAdaptor import BRepAdaptor_Curve + adaptor = BRepAdaptor_Curve(native.wrapped) + seam = adaptor.Value(adaptor.FirstParameter()) + wire = scad.make_wire_from_edges_rwire([native]) + reference = scad.make_face_from_wire_rface(wire) + sketch = scad.make_sketch_rsketch(name='periodic') + sketch = scad.add_point_rsketch(sketch, 'seam', seam.X(), seam.Y()) + sketch = scad.add_bspline_rsketch(sketch, 'boundary', 'seam', 'seam', poles, degree=2, periodic=True) + face = scad.make_face_from_sketch_rface(sketch=sketch) + assert face.get_area() == pytest.approx(reference.get_area(), rel=1e-9) From 6a6349497850ba8114cca6c800b90c2fcddbfecd Mon Sep 17 00:00:00 2001 From: yuliuse <13226860+yuliuse@user.noreply.gitee.com> Date: Wed, 7 Oct 2026 17:05:30 +0800 Subject: [PATCH 02/39] feat: add build123d to FTC conversion tools Capture Builder and algebra programs into portable feature traces, emit native FTC sources, and validate geometry in isolated processes. Include the API inventory, six real trace fixtures, inferred constraint recovery, and the 50-model benchmark. All models build; the tea-cup STEP reference-kernel failure remains explicit. --- .gitignore | 1 + test/build123d_traces/README.md | 18 + .../affine_trimmed_sphere.trace.json | 820 + .../closed_text_outline.trace.json | 311 + test/build123d_traces/face_mirror.trace.json | 249 + .../build123d_traces/filleted_hole.trace.json | 365 + .../lines_and_arcs.trace.json | 178 + test/build123d_traces/spring.trace.json | 1350 ++ test/test_affine_geometry_isolation.py | 25 + test/test_build123d_cli.py | 88 + test/test_build123d_trace.py | 229 + test/test_build123d_translation_output.py | 271 + test/test_build123d_unknown_api.py | 40 + test/test_build123d_validation.py | 215 + tools/research/build123dftc/API_RESEARCH.md | 124 + tools/research/build123dftc/BENCHMARK.md | 35 + tools/research/build123dftc/README.md | 147 + tools/research/build123dftc/api_coverage.json | 19803 ++++++++++++++++ .../build123dftc/b3ftc/_reference_worker.py | 44 + .../build123dftc/b3ftc/_trace_worker.py | 13 + .../build123dftc/b3ftc/_validate_worker.py | 260 + tools/research/build123dftc/b3ftc/emit.py | 140 + tools/research/build123dftc/b3ftc/geometry.py | 224 + tools/research/build123dftc/b3ftc/profiles.py | 207 + tools/research/build123dftc/b3ftc/replay.py | 493 + tools/research/build123dftc/b3ftc/schema.py | 8 + tools/research/build123dftc/b3ftc/tracer.py | 407 + .../research/build123dftc/b3ftc/validation.py | 314 + .../build123dftc/build123d_profile.py | 44 + .../research/build123dftc/build123d_to_ftc.py | 66 + .../research/build123dftc/build123d_trace.py | 121 + .../build123dftc/build123d_validate.py | 45 + .../build123dftc/research/inspect_api.py | 328 + 33 files changed, 26983 insertions(+) create mode 100644 test/build123d_traces/README.md create mode 100644 test/build123d_traces/affine_trimmed_sphere.trace.json create mode 100644 test/build123d_traces/closed_text_outline.trace.json create mode 100644 test/build123d_traces/face_mirror.trace.json create mode 100644 test/build123d_traces/filleted_hole.trace.json create mode 100644 test/build123d_traces/lines_and_arcs.trace.json create mode 100644 test/build123d_traces/spring.trace.json create mode 100644 test/test_affine_geometry_isolation.py create mode 100644 test/test_build123d_cli.py create mode 100644 test/test_build123d_trace.py create mode 100644 test/test_build123d_translation_output.py create mode 100644 test/test_build123d_unknown_api.py create mode 100644 test/test_build123d_validation.py create mode 100644 tools/research/build123dftc/API_RESEARCH.md create mode 100644 tools/research/build123dftc/BENCHMARK.md create mode 100644 tools/research/build123dftc/README.md create mode 100644 tools/research/build123dftc/api_coverage.json create mode 100644 tools/research/build123dftc/b3ftc/_reference_worker.py create mode 100644 tools/research/build123dftc/b3ftc/_trace_worker.py create mode 100644 tools/research/build123dftc/b3ftc/_validate_worker.py create mode 100644 tools/research/build123dftc/b3ftc/emit.py create mode 100644 tools/research/build123dftc/b3ftc/geometry.py create mode 100644 tools/research/build123dftc/b3ftc/profiles.py create mode 100644 tools/research/build123dftc/b3ftc/replay.py create mode 100644 tools/research/build123dftc/b3ftc/schema.py create mode 100644 tools/research/build123dftc/b3ftc/tracer.py create mode 100644 tools/research/build123dftc/b3ftc/validation.py create mode 100644 tools/research/build123dftc/build123d_profile.py create mode 100644 tools/research/build123dftc/build123d_to_ftc.py create mode 100644 tools/research/build123dftc/build123d_trace.py create mode 100644 tools/research/build123dftc/build123d_validate.py create mode 100644 tools/research/build123dftc/research/inspect_api.py diff --git a/.gitignore b/.gitignore index 062acb8b..74e1ac03 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,7 @@ tools/research/out/ tools/research/histjson/out/ tools/research/whucad/out/ tools/research/cadqueryftc/out/ +tools/research/build123dftc/out/ .venv-cq/ # Source screen recordings stay local; compressed MP4/GIF derivatives are tracked diff --git a/test/build123d_traces/README.md b/test/build123d_traces/README.md new file mode 100644 index 00000000..bb03c7e8 --- /dev/null +++ b/test/build123d_traces/README.md @@ -0,0 +1,18 @@ +# Portable build123d feature traces + +These fixtures contain the actual operation inputs captured from six of the +50 build123d examples supplied for the converter: lines and arcs, a selected +circular fillet, a mirrored profile, one closed font glyph with a hole, and a +nonplanar spring sweep, and a spherical cut/fillet followed by nonuniform scale. +The glyph is feature `s3` of the text example; the affine case retains the first +eight features of the keycap example. Other traces retain their entire history. + +The tests require SimpleCADAPI but do not import build123d, download source +programs, load result BReps, or use paths outside the repository. Curve data +contains exact analytic geometry or B-spline poles, knots, multiplicities, +and weights; it is not a mesh or a fitted final-body snapshot. + +Reference volumes use OCCT's adaptive Gauss–Kronrod integration with +`eps=1e-9` and B-spline span splitting. Original non-adaptive volumes remain +as diagnostic data because they differ materially on closed rational curves. +Each fixture records its build123d and source-kernel versions. diff --git a/test/build123d_traces/affine_trimmed_sphere.trace.json b/test/build123d_traces/affine_trimmed_sphere.trace.json new file mode 100644 index 00000000..1ed6153d --- /dev/null +++ b/test/build123d_traces/affine_trimmed_sphere.trace.json @@ -0,0 +1,820 @@ +{ + "schema_version": "1.0", + "steps": [ + { + "id": "s1", + "op": "extrude_taper", + "inputs": [], + "parameters": { + "direction": [ + 0.0, + 0.0, + 10.0 + ], + "taper": 15, + "flip_inner": true + }, + "source": "Solid.extrude_taper", + "result": { + "volume": 2371.1119335472795, + "volume_gk": 2371.1119335472795, + "area": 1118.2335726410245, + "default_volume": 2371.11193354728, + "bbox": [ + -9.0, + -9.0, + 0.0, + 9.0, + 9.0, + 10.000000000000005 + ], + "solid_count": 1 + }, + "profile": { + "kind": "face", + "origin": [ + -2.0816681711721685e-17, + -2.4671622769447924e-16, + 0.0 + ], + "x_dir": [ + 1.0, + 0.0, + -0.0 + ], + "y_dir": [ + -0.0, + 1.0, + 0.0 + ], + "normal": [ + 0.0, + 0.0, + 1.0 + ], + "wires": [ + { + "edges": [ + { + "kind": "line", + "start": [ + -9.0, + 9.0, + 0.0 + ], + "end": [ + -9.0, + -9.0, + 0.0 + ], + "parameter_range": [ + -9.0, + 9.0 + ], + "reversed": true + }, + { + "kind": "line", + "start": [ + -9.0, + -9.0, + 0.0 + ], + "end": [ + 9.0, + -9.0, + 0.0 + ], + "parameter_range": [ + -9.0, + 9.0 + ], + "reversed": false + }, + { + "kind": "line", + "start": [ + 9.0, + -9.0, + 0.0 + ], + "end": [ + 9.0, + 9.0, + 0.0 + ], + "parameter_range": [ + -9.0, + 9.0 + ], + "reversed": false + }, + { + "kind": "line", + "start": [ + 9.0, + 9.0, + 0.0 + ], + "end": [ + -9.0, + 9.0, + 0.0 + ], + "parameter_range": [ + -9.0, + 9.0 + ], + "reversed": true + } + ], + "closed": true + } + ] + } + }, + { + "id": "s2", + "op": "sphere", + "inputs": [], + "parameters": { + "radius": 40, + "plane": { + "origin": [ + 0.0, + 0.0, + 0.0 + ], + "x_dir": [ + 1.0, + 0.0, + -0.0 + ], + "y_dir": [ + -0.0, + 1.0, + 0.0 + ], + "normal": [ + 0.0, + 0.0, + 1.0 + ] + }, + "angle1": -90, + "angle2": 90, + "angle3": 360 + }, + "source": "Solid.make_sphere", + "result": { + "volume": 268082.57310632826, + "volume_gk": 268082.57310632826, + "area": 20106.192982974666, + "default_volume": 268082.5731063291, + "bbox": [ + -40.0, + -40.0, + -40.0, + 40.0, + 40.0, + 40.0 + ], + "solid_count": 1 + } + }, + { + "id": "s3", + "op": "transform", + "inputs": [ + "s2" + ], + "parameters": { + "loc": { + "matrix": [ + [ + 1.0, + 0.0, + 0.0, + -0.0 + ], + [ + 0.0, + 1.0, + 0.0, + -0.0 + ], + [ + 0.0, + 0.0, + 1.0, + -0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "method": "move", + "matrix": [ + [ + 1.0, + 0.0, + 0.0, + -0.0 + ], + [ + 0.0, + 1.0, + 0.0, + -0.0 + ], + [ + 0.0, + 0.0, + 1.0, + -0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "source": "Shape.move", + "result": { + "volume": 268082.57310632826, + "volume_gk": 268082.57310632826, + "area": 20106.192982974666, + "default_volume": 268082.5731063291, + "bbox": [ + -40.0, + -40.0, + -40.0, + 40.0, + 40.0, + 40.0 + ], + "solid_count": 1 + } + }, + { + "id": "s4", + "op": "transform", + "inputs": [ + "s3" + ], + "parameters": { + "loc": { + "matrix": [ + [ + 1.0, + -0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 2.220446049250313e-16, + -1.0, + 0.0 + ], + [ + 0.0, + 1.0, + 2.220446049250313e-16, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "method": "moved", + "matrix": [ + [ + 1.0, + -0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 2.220446049250313e-16, + -1.0, + 0.0 + ], + [ + 0.0, + 1.0, + 2.220446049250313e-16, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "source": "Shape.moved", + "result": { + "volume": 268082.5731063284, + "volume_gk": 268082.5731063284, + "area": 20106.192982974666, + "default_volume": 268082.5731063291, + "bbox": [ + -40.0, + -40.0, + -40.0, + 40.0, + 40.0, + 40.0 + ], + "solid_count": 1 + } + }, + { + "id": "s5", + "op": "transform", + "inputs": [ + "s4" + ], + "parameters": { + "loc": { + "matrix": [ + [ + 1.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 1.0, + 0.0, + -3.0 + ], + [ + 0.0, + 0.0, + 1.0, + 47.0 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "method": "moved", + "matrix": [ + [ + 1.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 1.0, + 0.0, + -3.0 + ], + [ + 0.0, + 0.0, + 1.0, + 47.0 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "source": "Shape.moved", + "result": { + "volume": 268082.5731063284, + "volume_gk": 268082.5731063284, + "area": 20106.192982974666, + "default_volume": 268082.5731063291, + "bbox": [ + -40.0, + -43.0, + 7.0, + 40.0, + 37.0, + 87.0 + ], + "solid_count": 1 + } + }, + { + "id": "s6", + "op": "cut", + "inputs": [ + "s1", + "s5" + ], + "parameters": {}, + "source": "Shape.cut", + "result": { + "volume": 1929.8444343829303, + "volume_gk": 1929.8444343829303, + "area": 1035.6152278365398, + "default_volume": 1929.844434382934, + "bbox": [ + -9.0, + -9.0, + 0.0, + 9.0, + 9.0, + 8.756864140153603 + ], + "solid_count": 1 + } + }, + { + "id": "s7", + "op": "fillet", + "inputs": [ + "s6" + ], + "parameters": { + "radius": 1 + }, + "source": "Mixin3D.fillet", + "result": { + "volume": 1914.6009359753375, + "volume_gk": 1914.6009359753375, + "area": 1002.7137487227009, + "default_volume": 1914.6009359753382, + "bbox": [ + -9.000000100000001, + -9.000000100000001, + -1e-07, + 9.000000100000001, + 9.000000100000001, + 8.441500309937386 + ], + "solid_count": 1 + }, + "selection": [ + { + "kind": "edge", + "geom_type": "LINE", + "center": [ + -7.955513473192318, + -7.955513473192318, + 3.898076785867421 + ], + "bbox": [ + -9.0, + -9.0, + 0.0, + -6.911026946384637, + -6.911026946384637, + 7.796153571734842 + ], + "length": 8.337123445861655, + "start": [ + -6.911026946384637, + -6.911026946384637, + 7.796153571734842 + ], + "mid": [ + -7.955513473192318, + -7.955513473192318, + 3.898076785867421 + ], + "end": [ + -9.0, + -9.0, + 0.0 + ], + "index": 4 + }, + { + "kind": "edge", + "geom_type": "LINE", + "center": [ + 7.955513473192318, + -7.955513473192318, + 3.898076785867421 + ], + "bbox": [ + 6.911026946384637, + -9.0, + 0.0, + 9.0, + -6.911026946384637, + 7.796153571734842 + ], + "length": 8.337123445861655, + "start": [ + 6.911026946384637, + -6.911026946384637, + 7.796153571734842 + ], + "mid": [ + 7.955513473192318, + -7.955513473192318, + 3.898076785867421 + ], + "end": [ + 9.0, + -9.0, + 0.0 + ], + "index": 7 + }, + { + "kind": "edge", + "geom_type": "LINE", + "center": [ + -7.826802662708394, + 7.826802662708394, + 4.378432070076798 + ], + "bbox": [ + -9.0, + 6.653605325416787, + 0.0, + -6.653605325416787, + 9.0, + 8.756864140153596 + ], + "length": 9.364497077095645, + "start": [ + -9.0, + 9.0, + 0.0 + ], + "mid": [ + -7.826802662708394, + 7.826802662708394, + 4.378432070076798 + ], + "end": [ + -6.653605325416787, + 6.653605325416787, + 8.756864140153596 + ], + "index": 6 + }, + { + "kind": "edge", + "geom_type": "LINE", + "center": [ + 7.826802662708394, + 7.826802662708394, + 4.378432070076798 + ], + "bbox": [ + 6.653605325416787, + 6.653605325416787, + 0.0, + 9.0, + 9.0, + 8.756864140153596 + ], + "length": 9.364497077095645, + "start": [ + 6.653605325416787, + 6.653605325416787, + 8.756864140153596 + ], + "mid": [ + 7.826802662708394, + 7.826802662708394, + 4.378432070076798 + ], + "end": [ + 9.0, + 9.0, + 0.0 + ], + "index": 9 + }, + { + "kind": "edge", + "geom_type": "CIRCLE", + "center": [ + 2.2364273360068107e-14, + -7.016130216452036, + 7.40390282780167 + ], + "bbox": [ + -6.911026946384598, + -7.068763296161196, + 7.207473500168263, + 6.911026946384642, + -6.911026946384634, + 7.796153571734848 + ], + "length": 13.893601237415288, + "start": [ + -6.911026946384598, + -6.911026946384636, + 7.796153571734841 + ], + "mid": [ + 2.2373044540339126e-14, + -7.068763296161196, + 7.207473500168263 + ], + "end": [ + 6.911026946384642, + -6.911026946384634, + 7.796153571734848 + ], + "index": 8 + }, + { + "kind": "edge", + "geom_type": "CIRCLE", + "center": [ + -6.882861213849936, + -0.10022652368490893, + 7.9012695165867335 + ], + "bbox": [ + -6.960821167729055, + -6.911026946384645, + 7.610319007754136, + -6.653605325416786, + 6.6536053254167875, + 8.756864140153603 + ], + "length": 13.667946481986268, + "start": [ + -6.653605325416786, + 6.6536053254167875, + 8.756864140153603 + ], + "mid": [ + -6.933207795109661, + -0.08596340420454629, + 7.713373517338049 + ], + "end": [ + -6.911026946384634, + -6.911026946384645, + 7.796153571734848 + ], + "index": 5 + }, + { + "kind": "edge", + "geom_type": "CIRCLE", + "center": [ + 6.882861213849936, + -0.10022652368489449, + 7.901269516586735 + ], + "bbox": [ + 6.653605325416786, + -6.911026946384631, + 7.610319007754136, + 6.960821167729055, + 6.653605325416802, + 8.756864140153603 + ], + "length": 13.667946481986268, + "start": [ + 6.911026946384634, + -6.911026946384631, + 7.796153571734848 + ], + "mid": [ + 6.933207795109661, + -0.08596340420453208, + 7.713373517338049 + ], + "end": [ + 6.653605325416786, + 6.653605325416802, + 8.756864140153603 + ], + "index": 10 + }, + { + "kind": "edge", + "geom_type": "CIRCLE", + "center": [ + -4.503045217372866e-14, + 6.74972397417161, + 8.398144459445728 + ], + "bbox": [ + -6.653605325416833, + 6.653605325416785, + 8.218533741391056, + 6.653605325416744, + 6.7978505210263345, + 8.756864140153603 + ], + "length": 13.369366777347004, + "start": [ + 6.653605325416744, + 6.653605325416788, + 8.756864140153588 + ], + "mid": [ + -4.531965428549345e-14, + 6.7978505210263345, + 8.218533741391056 + ], + "end": [ + -6.653605325416833, + 6.653605325416785, + 8.756864140153603 + ], + "index": 11 + } + ] + }, + { + "id": "s8", + "op": "transform", + "inputs": [ + "s7" + ], + "parameters": { + "factor": [ + 0.925, + 0.925, + 0.85 + ], + "about": [ + 0.0, + 0.0, + 0.0 + ], + "method": "scale" + }, + "source": "Shape.scale", + "result": { + "volume": 1392.4533674204192, + "volume_gk": 1392.4533674204192, + "area": 826.3818860013073, + "default_volume": 1392.4533674401873, + "bbox": [ + -8.325000100000002, + -8.325000100000002, + -1e-07, + 8.325000100000002, + 8.325000100000002, + 7.175275363446779 + ], + "solid_count": 1 + } + } + ], + "result_refs": [ + "s8" + ], + "b3d_status": "ok", + "b3d_volume": 1392.4533674204192, + "b3d_bbox": [ + -8.325000100000002, + -8.325000100000002, + -1e-07, + 8.325000100000002, + 8.325000100000002, + 7.175275363446779 + ], + "solid_count": 1, + "unsupported": [], + "error": "", + "b3d_default_volume": 1392.4533674401873, + "b3d_volume_gk": 1392.4533674204192, + "b3d_valid": true, + "b3d_area": 826.3818860013073, + "source_file": "models/45_key_cap.py", + "source_sha256": "3e3683ba02aff7a4d0baca83532875541030b095d2e46b4de7307437e384a6b4", + "build123d_version": "0.13.0", + "stem": "affine_trimmed_sphere", + "source_metadata": { + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/key_cap.py", + "source_sha256": "0e3b3e77b88e488ef093b308415072dddded3e971e72081bf1c0a51ad9ce2e73", + "export_options": { + "precision_mode": "AVERAGE", + "write_pcurves": true + } + }, + "extraction_note": "First eight real feature operations of model 45, through affine scale; source provenance retained." +} diff --git a/test/build123d_traces/closed_text_outline.trace.json b/test/build123d_traces/closed_text_outline.trace.json new file mode 100644 index 00000000..f44eb7fc --- /dev/null +++ b/test/build123d_traces/closed_text_outline.trace.json @@ -0,0 +1,311 @@ +{ + "schema_version": "1.0", + "steps": [ + { + "id": "s3", + "op": "extrude", + "inputs": [], + "parameters": { + "direction": [ + 0.0, + 0.0, + 4.0 + ] + }, + "source": "Solid.extrude", + "result": { + "volume": 289.73641490428105, + "volume_gk": 289.73641490428105, + "default_volume": 290.6612252204212, + "bbox": [ + 14.874267428125, + -7.713174450168028e-15, + 4.9999999, + 27.020263721875, + 13.549804887499992, + 9.0000001 + ], + "solid_count": 1 + }, + "profile": { + "kind": "face", + "origin": [ + 20.952972409981427, + 6.772877390140605, + 5.0 + ], + "x_dir": [ + 1.0, + 0.0, + -0.0 + ], + "y_dir": [ + -0.0, + 1.0, + 0.0 + ], + "normal": [ + 0.0, + 0.0, + 1.0 + ], + "wires": [ + { + "edges": [ + { + "kind": "bspline", + "start": [ + 16.876220653125, + 12.109375099999992, + 5.0 + ], + "end": [ + 16.876220653125, + 12.109375099999992, + 5.0 + ], + "parameter_range": [ + 0.0, + 6.5628065631728365 + ], + "reversed": false, + "degree": 2, + "poles": [ + [ + 16.876220653125, + 12.109375099999992, + 5.0 + ], + [ + 14.874267528125, + 10.375976662499992, + 5.0 + ], + [ + 14.874267528125, + 3.4912110374999923, + 5.0 + ], + [ + 18.231201121875, + 9.999999228682555e-08, + 5.0 + ], + [ + 22.650146434375, + 9.999999228682555e-08, + 5.0 + ], + [ + 25.518798778125, + 1.5869141624999923, + 5.0 + ], + [ + 27.020263621875, + 4.455566506249992, + 5.0 + ], + [ + 27.020263621875, + 10.046386818749992, + 5.0 + ], + [ + 23.626708934375, + 13.549804787499992, + 5.0 + ], + [ + 18.548583934375, + 13.549804787499992, + 5.0 + ], + [ + 16.876220653125, + 12.109375099999992, + 5.0 + ] + ], + "weights": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "knots": [ + 0.0, + 1.0, + 1.911864406779661, + 2.823728813559322, + 3.39211066352512, + 3.9604925134909177, + 4.5288743634567155, + 5.230340744146212, + 5.931807124835709, + 6.5628065631728365 + ], + "multiplicities": [ + 3, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 3 + ], + "periodic": false + } + ], + "closed": true + }, + { + "edges": [ + { + "kind": "bspline", + "start": [ + 17.132568309375, + 6.774902443749992, + 5.0 + ], + "end": [ + 17.132568309375, + 6.774902443749992, + 5.0 + ], + "parameter_range": [ + 0.0, + 8.16675617962079 + ], + "reversed": false, + "degree": 2, + "poles": [ + [ + 17.132568309375, + 6.774902443749992, + 5.0 + ], + [ + 17.132568309375, + 9.265136818749992, + 5.0 + ], + [ + 19.305419871875, + 11.730957131249992, + 5.0 + ], + [ + 22.576904246875, + 11.730957131249992, + 5.0 + ], + [ + 24.761962840625, + 9.252929787499992, + 5.0 + ], + [ + 24.761962840625, + 4.296875099999992, + 5.0 + ], + [ + 22.589111278125, + 1.8066407249999923, + 5.0 + ], + [ + 19.305419871875, + 1.8066407249999923, + 5.0 + ], + [ + 17.132568309375, + 4.284668068749992, + 5.0 + ], + [ + 17.132568309375, + 6.774902443749992, + 5.0 + ] + ], + "weights": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "knots": [ + 0.0, + 1.0, + 2.0, + 2.985185185185185, + 3.97037037037037, + 5.015566835871404, + 6.060763301372438, + 7.113759740496614, + 8.16675617962079 + ], + "multiplicities": [ + 3, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 3 + ], + "periodic": false + } + ], + "closed": true + } + ] + } + } + ], + "result_refs": [ + "s3" + ], + "b3d_status": "ok", + "b3d_volume": 289.73641490428105, + "b3d_volume_gk": 289.73641490428105, + "b3d_default_volume": 290.6612252204212, + "b3d_bbox": [ + 14.874267428125, + -7.713174450168028e-15, + 4.9999999, + 27.020263721875, + 13.549804887499992, + 9.0000001 + ], + "solid_count": 1, + "unsupported": [], + "fixture_provenance": { + "source_stem": "34_embossed_debossed_text", + "source_feature": "s3", + "build123d_version": "0.13.0", + "source_kernel": "8.0.1.1", + "reference_volume_method": "Gauss-Kronrod, eps=1e-9, use_span=True" + } +} diff --git a/test/build123d_traces/face_mirror.trace.json b/test/build123d_traces/face_mirror.trace.json new file mode 100644 index 00000000..8dd7d189 --- /dev/null +++ b/test/build123d_traces/face_mirror.trace.json @@ -0,0 +1,249 @@ +{ + "schema_version": "1.0", + "steps": [ + { + "id": "s1", + "op": "extrude", + "inputs": [], + "parameters": { + "direction": [ + 0.0, + 0.0, + 20.0 + ] + }, + "source": "Solid.extrude", + "result": { + "volume": 42797.5432332819, + "volume_gk": 42797.5432332819, + "default_volume": 42797.54323328191, + "bbox": [ + -24.270509831248425, + -28.53169548885461, + 0.0, + 30.0, + 28.531695488854606, + 20.0 + ], + "solid_count": 1 + }, + "profile": { + "kind": "face", + "origin": [ + -9.23053696217674e-16, + 0.0, + 0.0 + ], + "x_dir": [ + 1.0, + 0.0, + -0.0 + ], + "y_dir": [ + -0.0, + 1.0, + 0.0 + ], + "normal": [ + 0.0, + 0.0, + 1.0 + ], + "wires": [ + { + "edges": [ + { + "kind": "line", + "start": [ + 30.0, + 0.0, + 0.0 + ], + "end": [ + 9.270509831248427, + 28.531695488854602, + 0.0 + ], + "parameter_range": [ + 0.0, + 35.26711513754839 + ], + "reversed": false + }, + { + "kind": "line", + "start": [ + 9.270509831248424, + 28.531695488854606, + 0.0 + ], + "end": [ + -24.27050983124842, + 17.633557568774197, + 0.0 + ], + "parameter_range": [ + 0.0, + 35.26711513754839 + ], + "reversed": false + }, + { + "kind": "line", + "start": [ + -24.27050983124842, + 17.633557568774197, + 0.0 + ], + "end": [ + -24.270509831248425, + -17.63355756877419, + 0.0 + ], + "parameter_range": [ + 0.0, + 35.26711513754839 + ], + "reversed": false + }, + { + "kind": "line", + "start": [ + -24.270509831248425, + -17.63355756877419, + 0.0 + ], + "end": [ + 9.270509831248418, + -28.53169548885461, + 0.0 + ], + "parameter_range": [ + 0.0, + 35.26711513754839 + ], + "reversed": false + }, + { + "kind": "line", + "start": [ + 9.270509831248416, + -28.53169548885461, + 0.0 + ], + "end": [ + 29.999999999999996, + 3.548257364643738e-16, + 0.0 + ], + "parameter_range": [ + 0.0, + 35.267115137548394 + ], + "reversed": false + } + ], + "closed": true + } + ] + } + }, + { + "id": "s2", + "op": "transform", + "inputs": [ + "s1" + ], + "parameters": { + "mirror_plane": { + "origin": [ + -7.500000000000003, + -23.0826265288144, + 10.0 + ], + "x_dir": [ + 0.9510565162951525, + -0.30901699437495084, + 0.0 + ], + "y_dir": [ + -0.0, + 0.0, + 1.0 + ], + "normal": [ + -0.30901699437495084, + -0.9510565162951525, + -0.0 + ] + }, + "method": "mirror" + }, + "source": "Shape.mirror", + "result": { + "volume": 42797.54323328192, + "volume_gk": 42797.54323328192, + "default_volume": 42797.54323328192, + "bbox": [ + -45.00000000000017, + -74.69694854648331, + 0.0, + 9.270509831248383, + -17.633557568774084, + 20.0 + ], + "solid_count": 1 + } + }, + { + "id": "s3", + "op": "union", + "inputs": [ + "s1", + "s2" + ], + "parameters": { + "glue": false, + "tol": null + }, + "source": "Shape.fuse", + "result": { + "volume": 85595.08646656375, + "volume_gk": 85595.08646656375, + "default_volume": 85595.08646656378, + "bbox": [ + -45.00000000000017, + -74.69694854648331, + 0.0, + 30.0, + 28.531695488854606, + 20.0 + ], + "solid_count": 1 + } + } + ], + "result_refs": [ + "s3" + ], + "b3d_volume": 85595.08646656375, + "b3d_volume_gk": 85595.08646656375, + "b3d_default_volume": 85595.08646656378, + "b3d_bbox": [ + -45.00000000000017, + -74.69694854648331, + 0.0, + 30.0, + 28.531695488854606, + 20.0 + ], + "solid_count": 1, + "b3d_status": "ok", + "unsupported": [], + "fixture_provenance": { + "source_stem": "17_face_mirror", + "build123d_version": "0.13.0", + "source_kernel": "8.0.1.1", + "reference_volume_method": "Gauss-Kronrod, eps=1e-9, use_span=True" + } +} diff --git a/test/build123d_traces/filleted_hole.trace.json b/test/build123d_traces/filleted_hole.trace.json new file mode 100644 index 00000000..713a9184 --- /dev/null +++ b/test/build123d_traces/filleted_hole.trace.json @@ -0,0 +1,365 @@ +{ + "schema_version": "1.0", + "steps": [ + { + "id": "s1", + "op": "box", + "inputs": [], + "parameters": { + "length": 80.0, + "width": 60.0, + "height": 10.0, + "plane": { + "origin": [ + 0.0, + 0.0, + 0.0 + ], + "x_dir": [ + 1.0, + 0.0, + -0.0 + ], + "y_dir": [ + -0.0, + 1.0, + 0.0 + ], + "normal": [ + 0.0, + 0.0, + 1.0 + ] + } + }, + "source": "Solid.make_box", + "result": { + "volume": 47999.99999999999, + "volume_gk": 47999.99999999999, + "default_volume": 48000.0, + "bbox": [ + 0.0, + 0.0, + 0.0, + 80.0, + 60.0, + 10.0 + ], + "solid_count": 1 + } + }, + { + "id": "s2", + "op": "transform", + "inputs": [ + "s1" + ], + "parameters": { + "loc": { + "matrix": [ + [ + 1.0, + 0.0, + 0.0, + -40.0 + ], + [ + 0.0, + 1.0, + 0.0, + -30.0 + ], + [ + 0.0, + 0.0, + 1.0, + -5.0 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "method": "move", + "matrix": [ + [ + 1.0, + 0.0, + 0.0, + -40.0 + ], + [ + 0.0, + 1.0, + 0.0, + -30.0 + ], + [ + 0.0, + 0.0, + 1.0, + -5.0 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "source": "Shape.move", + "result": { + "volume": 47999.99999999999, + "volume_gk": 47999.99999999999, + "default_volume": 48000.0, + "bbox": [ + -40.0, + -30.0, + -5.0, + 40.0, + 30.0, + 5.0 + ], + "solid_count": 1 + } + }, + { + "id": "s3", + "op": "cylinder", + "inputs": [], + "parameters": { + "radius": 15.0, + "height": 200.9975124224178, + "plane": { + "origin": [ + 0.0, + 0.0, + 100.4987562112089 + ], + "x_dir": [ + -1.0, + 0.0, + -0.0 + ], + "y_dir": [ + 0.0, + 1.0, + 0.0 + ], + "normal": [ + 0.0, + 0.0, + -1.0 + ] + }, + "angle": 360 + }, + "source": "Solid.make_cylinder", + "result": { + "volume": 142076.76939362014, + "volume_gk": 142076.76939362014, + "default_volume": 142076.76939362046, + "bbox": [ + -15.0, + -15.0, + -100.4987562112089, + 15.0, + 15.0, + 100.4987562112089 + ], + "solid_count": 1 + } + }, + { + "id": "s4", + "op": "transform", + "inputs": [ + "s3" + ], + "parameters": { + "loc": { + "matrix": [ + [ + 1.0, + 0.0, + 0.0, + -0.0 + ], + [ + 0.0, + 1.0, + 0.0, + -0.0 + ], + [ + 0.0, + 0.0, + 1.0, + -0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "method": "move", + "matrix": [ + [ + 1.0, + 0.0, + 0.0, + -0.0 + ], + [ + 0.0, + 1.0, + 0.0, + -0.0 + ], + [ + 0.0, + 0.0, + 1.0, + -0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "source": "Shape.move", + "result": { + "volume": 142076.76939362014, + "volume_gk": 142076.76939362014, + "default_volume": 142076.76939362046, + "bbox": [ + -15.0, + -15.0, + -100.4987562112089, + 15.0, + 15.0, + 100.4987562112089 + ], + "solid_count": 1 + } + }, + { + "id": "s5", + "op": "cut", + "inputs": [ + "s2", + "s4" + ], + "parameters": {}, + "source": "Shape.cut", + "result": { + "volume": 40931.41652942296, + "volume_gk": 40931.41652942296, + "default_volume": 40931.41652942296, + "bbox": [ + -40.0, + -30.0, + -5.0, + 40.0, + 30.0, + 5.0 + ], + "solid_count": 1 + } + }, + { + "id": "s6", + "op": "fillet", + "inputs": [ + "s5" + ], + "parameters": { + "radius": 2 + }, + "source": "Mixin3D.fillet", + "result": { + "volume": 40848.104058581375, + "volume_gk": 40848.104058581375, + "default_volume": 40848.10405858136, + "bbox": [ + -40.0, + -30.0, + -5.0, + 40.0, + 30.0, + 5.0 + ], + "solid_count": 1 + }, + "selection": [ + { + "kind": "edge", + "geom_type": "CIRCLE", + "center": [ + -7.0682404105834e-14, + -4.637201104937301e-16, + 4.999999999999999 + ], + "bbox": [ + -15.0, + -15.0, + 5.0, + 15.0, + 15.0, + 5.0 + ], + "length": 94.2477796076938, + "start": [ + -15.0, + -1.699661669294394e-14, + 5.0 + ], + "mid": [ + 15.0, + 8.49830834647197e-15, + 5.0 + ], + "end": [ + -15.0, + 0.0, + 5.0 + ], + "index": 9 + } + ] + } + ], + "result_refs": [ + "s6" + ], + "b3d_volume": 40848.104058581375, + "b3d_volume_gk": 40848.104058581375, + "b3d_default_volume": 40848.10405858136, + "b3d_bbox": [ + -40.0, + -30.0, + -5.0, + 40.0, + 30.0, + 5.0 + ], + "solid_count": 1, + "b3d_status": "ok", + "unsupported": [], + "fixture_provenance": { + "source_stem": "10_filleted_hole", + "build123d_version": "0.13.0", + "source_kernel": "8.0.1.1", + "reference_volume_method": "Gauss-Kronrod, eps=1e-9, use_span=True" + } +} diff --git a/test/build123d_traces/lines_and_arcs.trace.json b/test/build123d_traces/lines_and_arcs.trace.json new file mode 100644 index 00000000..e238548d --- /dev/null +++ b/test/build123d_traces/lines_and_arcs.trace.json @@ -0,0 +1,178 @@ +{ + "schema_version": "1.0", + "steps": [ + { + "id": "s1", + "op": "extrude", + "inputs": [], + "parameters": { + "direction": [ + 0.0, + 0.0, + 10.0 + ] + }, + "source": "Solid.extrude", + "result": { + "volume": 69504.67164903213, + "volume_gk": 69504.67164903213, + "default_volume": 69504.6716490322, + "bbox": [ + 0.0, + 0.0, + 0.0, + 80.0, + 95.31128874149275, + 10.0 + ], + "solid_count": 1 + }, + "profile": { + "kind": "face", + "origin": [ + 40.0, + 43.87364956936529, + 0.0 + ], + "x_dir": [ + 1.0, + 0.0, + -0.0 + ], + "y_dir": [ + -0.0, + 1.0, + 0.0 + ], + "normal": [ + 0.0, + 0.0, + 1.0 + ], + "wires": [ + { + "edges": [ + { + "kind": "line", + "start": [ + 0.0, + 0.0, + 0.0 + ], + "end": [ + 80.0, + 0.0, + 0.0 + ], + "parameter_range": [ + 0.0, + 80.0 + ], + "reversed": false + }, + { + "kind": "line", + "start": [ + 80.0, + 0.0, + 0.0 + ], + "end": [ + 80.0, + 60.0, + 0.0 + ], + "parameter_range": [ + 0.0, + 60.0 + ], + "reversed": false + }, + { + "kind": "arc", + "mid": [ + 40.00000000000001, + 95.31128874149275, + 0.0 + ], + "start": [ + 80.0, + 60.0, + 0.0 + ], + "end": [ + 0.0, + 60.00000000000001, + 0.0 + ], + "parameter_range": [ + 0.0, + 2.89288266449627 + ], + "reversed": false, + "center": [ + 40.0, + 55.0, + 0.0 + ], + "radius": 40.311288741492746, + "normal": [ + 0.0, + 0.0, + 1.0 + ], + "x_dir": [ + 0.9922778767136677, + 0.12403473458920847, + -0.0 + ] + }, + { + "kind": "line", + "start": [ + 0.0, + 60.0, + 0.0 + ], + "end": [ + 0.0, + 0.0, + 0.0 + ], + "parameter_range": [ + 0.0, + 60.0 + ], + "reversed": false + } + ], + "closed": true + } + ] + } + } + ], + "result_refs": [ + "s1" + ], + "b3d_volume": 69504.67164903213, + "b3d_volume_gk": 69504.67164903213, + "b3d_default_volume": 69504.6716490322, + "b3d_bbox": [ + 0.0, + 0.0, + 0.0, + 80.0, + 95.31128874149275, + 10.0 + ], + "solid_count": 1, + "b3d_status": "ok", + "unsupported": [], + "fixture_provenance": { + "source_stem": "04_lines_and_arcs_profile", + "build123d_version": "0.13.0", + "source_kernel": "8.0.1.1", + "reference_volume_method": "Gauss-Kronrod, eps=1e-9, use_span=True" + } +} diff --git a/test/build123d_traces/spring.trace.json b/test/build123d_traces/spring.trace.json new file mode 100644 index 00000000..5341a7db --- /dev/null +++ b/test/build123d_traces/spring.trace.json @@ -0,0 +1,1350 @@ +{ + "schema_version": "1.0", + "steps": [ + { + "id": "s1", + "op": "sweep", + "inputs": [], + "parameters": { + "make_solid": true, + "is_frenet": false, + "mode": null, + "transition": "TRANSFORMED" + }, + "source": "Solid.sweep", + "result": { + "volume": 35.642805167823504, + "volume_gk": 35.642805167823504, + "default_volume": 35.642681367230885, + "bbox": [ + -2.300012799317609, + -2.3000127993174146, + -0.2990547016451006, + 2.3000127993175012, + 2.3000127993174946, + 10.299054701644959 + ], + "solid_count": 1 + }, + "profile": { + "kind": "face", + "origin": [ + 2.0, + 6.652720096874938e-16, + 3.089313816368428e-17 + ], + "x_dir": [ + -1.0, + 1.3153723711470598e-10, + -1.6540802198634257e-09 + ], + "y_dir": [ + -1.6593020853332313e-09, + -0.07932669684361024, + 0.996848672150333 + ], + "normal": [ + -9.000000000000026e-14, + 0.996848672150333, + 0.07932669684361024 + ], + "wires": [ + { + "edges": [ + { + "kind": "circle", + "start": [ + 1.7, + 3.9463258065123386e-11, + -4.962243907043456e-10 + ], + "end": [ + 1.7, + 3.9463263893954504e-11, + -4.962244639515977e-10 + ], + "parameter_range": [ + 0.0, + 6.283185307179586 + ], + "reversed": false, + "center": [ + 2.0, + 6.661338147750939e-16, + 0.0 + ], + "radius": 0.3, + "normal": [ + -8.536480491004258e-14, + 0.996848672150333, + 0.07932669684360946 + ], + "x_dir": [ + -1.0, + 1.3154197310436203e-10, + -1.6540813023478187e-09 + ] + } + ], + "closed": true + } + ] + }, + "path": { + "edges": [ + { + "kind": "bspline", + "start": [ + 2.0, + 6.661338147750939e-16, + 0.0 + ], + "end": [ + 2.0, + -5.047582789074024e-15, + 10.000000000000002 + ], + "parameter_range": [ + 0.0, + 63.62265131567328 + ], + "reversed": false, + "degree": 13, + "poles": [ + [ + 2.0, + 6.661338147750939e-16, + 0.0 + ], + [ + 1.9999999999999483, + 0.6041524333821656, + 0.04807692307685436 + ], + [ + 1.8022915771936825, + 1.208304870905466, + 0.09615384615415443 + ], + [ + 1.4068747452798505, + 1.7418755258527725, + 0.14423076922994169 + ], + [ + 0.8414668189386844, + 2.1342829054726824, + 0.1923076923092902 + ], + [ + 0.16150280081281543, + 2.3270383484976986, + 0.24038461538226746 + ], + [ + -0.555802317397056, + 2.285844591901501, + 0.28846153846423295 + ], + [ + -1.2233246240282272, + 2.009347799270346, + 0.336538461536015 + ], + [ + -1.759664321949602, + 1.5312648706945784, + 0.3846153846171492 + ], + [ + -2.104172809238839, + 0.9141590215986823, + 0.43269230769130473 + ], + [ + -2.226502668984004, + 0.23688132365397352, + 0.4807692307696662 + ], + [ + -2.128813163865841, + -0.4200120279538607, + 0.5288461538460247 + ], + [ + -1.8414138448882833, + -0.9870132798576515, + 0.5769230769230892 + ], + [ + -0.9870132798577862, + -1.841413844888405, + 0.6730769230769338 + ], + [ + -0.42001202795322584, + -2.1288131638652668, + 0.7211538461536989 + ], + [ + 0.2368813236521682, + -2.2265026689856753, + 0.7692307692313213 + ], + [ + 0.9141590216025747, + -2.1041728092354055, + 0.8173076923063703 + ], + [ + 1.531264870687806, + -1.7596643219548758, + 0.8653846153869104 + ], + [ + 2.009347799279881, + -1.223324624021997, + 0.9134615384585185 + ], + [ + 2.2858445918908323, + -0.5558023174028356, + 0.9615384615415711 + ], + [ + 2.327038348507003, + 0.1615028008170587, + 1.0096153846128404 + ], + [ + 2.134282905466487, + 0.8414668189362138, + 1.0576923076939477 + ], + [ + 1.7418755258558447, + 1.40687474528098, + 1.1057692307684408 + ], + [ + 1.2083048709043918, + 1.802291577193289, + 1.153846153846394 + ], + [ + 0.6041524333823806, + 2.0000000000000338, + 1.2019230769230707 + ], + [ + -0.60415243338235, + 1.9999999999999694, + 1.2980769230768512 + ], + [ + -1.2083048709047663, + 1.802291577193527, + 1.346153846154394 + ], + [ + -1.7418755258545406, + 1.406874745280456, + 1.3942307692290825 + ], + [ + -2.1342829054693033, + 0.8414668189370608, + 1.4423076923112175 + ], + [ + -2.3270383485027906, + 0.1615028008159628, + 1.490384615379138 + ], + [ + -2.2858445918954327, + -0.5558023174016837, + 1.5384615384681204 + ], + [ + -2.009347799276032, + -1.2233246240229605, + 1.5865384615321823 + ], + [ + -1.5312648706904137, + -1.7596643219542796, + 1.6346153846201954 + ], + [ + -0.9141590216010391, + -2.1041728092356133, + 1.6826923076893723 + ], + [ + -0.23688132365297554, + -2.2265026689856637, + 1.730769230770599 + ], + [ + 0.4200120279535802, + -2.1288131638652725, + 1.7788461538457223 + ], + [ + 0.9870132798576695, + -1.8414138448883566, + 1.826923076923126 + ], + [ + 1.8414138448884514, + -0.9870132798577959, + 1.9230769230769404 + ], + [ + 2.128813163864945, + -0.4200120279529417, + 1.9711538461535816 + ], + [ + 2.226502668986428, + 0.23688132365119724, + 2.019230769231603 + ], + [ + 2.1041728092342944, + 0.9141590216045443, + 2.067307692305985 + ], + [ + 1.759664321955971, + 1.531264870684877, + 2.1153846153872093 + ], + [ + 1.223324624021276, + 2.009347799283421, + 2.1634615384584075 + ], + [ + 0.5558023174030458, + 2.285844591887129, + 2.2115384615415885 + ], + [ + -0.16150280081684026, + 2.3270383485103614, + 2.2596153846127724 + ], + [ + -0.8414668189366271, + 2.134282905463938, + 2.3076923076941025 + ], + [ + -1.4068747452806216, + 1.741875525857392, + 2.3557692307682663 + ], + [ + -1.802291577193468, + 1.2083048709036788, + 2.4038461538465112 + ], + [ + -1.999999999999993, + 0.6041524333826138, + 2.4519230769230216 + ], + [ + -2.0000000000000036, + -0.60415243338269, + 2.548076923076934 + ], + [ + -1.8022915771934396, + -1.208304870902915, + 2.5961538461539533 + ], + [ + -1.406874745280619, + -1.7418755258598626, + 2.6442307692302807 + ], + [ + -0.8414668189367117, + -2.134282905458664, + 2.692307692309037 + ], + [ + -0.1615028008165532, + -2.327038348518791, + 2.740384615381839 + ], + [ + 0.5558023174023855, + -2.2858445918765837, + 2.7884615384658793 + ], + [ + 1.223324624022344, + -2.009347799293845, + 2.8365384615333173 + ], + [ + 1.7596643219547532, + -1.531264870676808, + 2.8846153846199845 + ], + [ + 2.1041728092353202, + -0.9141590216093117, + 2.932692307689301 + ], + [ + 2.22650266898584, + -0.23688132364910672, + 2.980769230770539 + ], + [ + 2.128813163865153, + 0.42001202795234166, + 3.028846153845933 + ], + [ + 1.841413844888438, + 0.987013279857846, + 3.0769230769229154 + ], + [ + 0.9870132798576133, + 1.8414138448884376, + 3.1730769230774123 + ], + [ + 0.42001202795398135, + 2.128813163864508, + 3.221153846150588 + ], + [ + -0.23688132365419814, + 2.226502668988156, + 3.2692307692407536 + ], + [ + -0.9141590215985614, + 2.1041728092302887, + 3.317307692286612 + ], + [ + -1.5312648706939194, + 1.7596643219626364, + 3.365384615418172 + ], + [ + -2.00934779927267, + 1.2233246240127316, + 3.413461538419854 + ], + [ + -2.2858445918974035, + 0.5558023174118611, + 3.461538461579471 + ], + [ + -2.327038348502379, + -0.16150280082438673, + 3.509615384583322 + ], + [ + -2.134282905468952, + -0.8414668189313265, + 3.557692307712066 + ], + [ + -1.7418755258549337, + -1.4068747452834651, + 3.605769230759894 + ], + [ + -1.2083048709045383, + -1.8022915771924415, + 3.6538461538492917 + ], + [ + -0.6041524333824554, + -2.0000000000001457, + 3.701923076922517 + ], + [ + 0.6041524333825566, + -1.9999999999999754, + 3.798076923077314 + ], + [ + 1.2083048709032667, + -1.8022915771931862, + 3.8461538461525504 + ], + [ + 1.7418755258591465, + -1.4068747452816484, + 3.894230769233875 + ], + [ + 2.1342829054596724, + -0.841466818934496, + 3.942307692302027 + ], + [ + 2.32703834851759, + -0.16150280082005888, + 3.990384615392585 + ], + [ + 2.285844591877996, + 0.555802317406608, + 4.038461538452697 + ], + [ + 2.0093477992920947, + 1.2233246240182585, + 4.0865384615462865 + ], + [ + 1.5312648706787897, + 1.7596643219578538, + 4.134615384609838 + ], + [ + 0.9141590216076623, + 2.1041728092334813, + 4.182692307695468 + ], + [ + 0.23688132365004666, + 2.226502668986602, + 4.230769230767802 + ], + [ + -0.4200120279526195, + 2.128813163865019, + 4.278846153846611 + ], + [ + -0.9870132798578423, + 1.8414138448883532, + 4.326923076923031 + ], + [ + -1.8414138448883082, + 0.9870132798579057, + 4.423076923076879 + ], + [ + -2.1288131638654924, + 0.42001202795204434, + 4.471153846154212 + ], + [ + -2.2265026689851264, + -0.23688132364829764, + 4.519230769229973 + ], + [ + -2.104172809236565, + -0.9141590216110625, + 4.567307692308481 + ], + [ + -1.7596643219528143, + -1.5312648706739498, + 4.615384615384955 + ], + [ + -1.223324624024944, + -2.0093477992974025, + 4.663461538458743 + ], + [ + -0.555802317399491, + -2.2858445918732224, + 4.711538461543929 + ], + [ + 0.16150280081409893, + -2.3270383485212665, + 4.759615384608758 + ], + [ + 0.8414668189382435, + -2.1342829054572143, + 4.807692307697982 + ], + [ + 1.4068747452799755, + -1.741875525860566, + 4.855769230765668 + ], + [ + 1.8022915771936252, + -1.2083048709025832, + 4.903846153847806 + ], + [ + 1.9999999999999802, + -0.6041524333828419, + 4.951923076922511 + ], + [ + 2.0000000000000084, + 0.6041524333829378, + 5.048076923077781 + ], + [ + 1.8022915771935002, + 1.2083048709016495, + 5.096153846149207 + ], + [ + 1.40687474528029, + 1.7418755258633165, + 5.14423076924378 + ], + [ + 0.8414668189379731, + 2.1342829054516783, + 5.1923076922821405 + ], + [ + 0.1615028008136067, + 2.3270383485300115, + 5.24038461542245 + ], + [ + -0.5558023173980627, + 2.2858445918620824, + 5.2884615384179465 + ], + [ + -1.2233246240265405, + 2.0093477993088764, + 5.336538461578303 + ], + [ + -1.759664321951844, + 1.5312648706645449, + 5.384615384586182 + ], + [ + -2.10417280923674, + 0.9141590216169742, + 5.432692307709485 + ], + [ + -2.226502668985374, + 0.23688132364566097, + 5.480769230761262 + ], + [ + -2.128813163865221, + -0.42001202795128517, + 5.528846153848939 + ], + [ + -1.841413844888457, + -0.9870132798580189, + 5.576923076922424 + ], + [ + -0.9870132798575849, + -1.8414138448882669, + 5.6730769230776925 + ], + [ + -0.420012027954111, + -2.128813163865314, + 5.721153846149946 + ], + [ + 0.2368813236545341, + -2.2265026689858023, + 5.7692307692421325 + ], + [ + 0.9141590215976688, + -2.1041728092354037, + 5.817307692284152 + ], + [ + 1.531264870696111, + -1.7596643219539576, + 5.86538461542164 + ], + [ + 2.009347799268774, + -1.2233246240241786, + 5.913461538416068 + ], + [ + 2.2858445919022303, + -0.5558023174003069, + 5.961538461582642 + ], + [ + 2.3270383484981876, + 0.1615028008155162, + 6.0096153845812825 + ], + [ + 2.134282905471544, + 0.8414668189366524, + 6.057692307713076 + ], + [ + 1.7418755258537841, + 1.4068747452810244, + 6.105769230759544 + ], + [ + 1.2083048709048787, + 1.8022915771932297, + 6.153846153849315 + ], + [ + 0.6041524333823935, + 2.000000000000041, + 6.201923076922612 + ], + [ + -0.6041524333825374, + 1.9999999999999893, + 6.298076923077063 + ], + [ + -1.2083048709034343, + 1.8022915771934118, + 6.346153846154186 + ], + [ + -1.741875525858368, + 1.4068747452807753, + 6.394230769229149 + ], + [ + -2.134282905461634, + 0.8414668189366404, + 6.4423076923116795 + ], + [ + -2.327038348514876, + 0.16150280081609175, + 6.4903846153772005 + ], + [ + -2.285844591879941, + -0.5558023174015779, + 6.538461538472675 + ], + [ + -2.0093477992921986, + -1.2233246240226923, + 6.586538461524955 + ], + [ + -1.5312648706769878, + -1.759664321955127, + 6.634615384628441 + ], + [ + -0.9141590216095852, + -2.104172809234644, + 6.682692307682479 + ], + [ + -0.23688132364902123, + -2.22650266898628, + 6.730769230774807 + ], + [ + 0.4200120279523284, + -2.1288131638650727, + 6.778846153843907 + ], + [ + 0.9870132798579115, + -1.8414138448883368, + 6.826923076923632 + ], + [ + 1.8414138448882231, + -0.9870132798579234, + 6.923076923076314 + ], + [ + 2.1288131638659307, + -0.42001202795207304, + 6.971153846156448 + ], + [ + 2.2265026689837657, + 0.23688132364868128, + 7.019230769224817 + ], + [ + 2.104172809239701, + 0.9141590216094687, + 7.067307692316733 + ], + [ + 1.7596643219474462, + 1.531264870677658, + 7.115384615374962 + ], + [ + 1.22332462403152, + 2.009347799291817, + 7.1634615384687494 + ], + [ + 0.5558023173941883, + 2.285844591878955, + 7.211538461535101 + ], + [ + -0.1615028008117135, + 2.327038348517077, + 7.259615384615659 + ], + [ + -0.8414668189383224, + 2.1342829054594192, + 7.307692307693514 + ], + [ + -1.4068747452805237, + 1.7418755258597582, + 7.355769230767805 + ], + [ + -1.8022915771932797, + 1.208304870902799, + 7.403846153847179 + ], + [ + -2.000000000000064, + 0.6041524333828056, + 7.4519230769225455 + ], + [ + -1.9999999999999298, + -0.6041524333828427, + 7.548076923077893 + ], + [ + -1.802291577193757, + -1.2083048709021935, + 7.5961538461480504 + ], + [ + -1.4068747452799983, + -1.741875525861654, + 7.644230769248086 + ], + [ + -0.8414668189377974, + -2.1342829054549712, + 7.692307692271547 + ], + [ + -0.16150280081486876, + -2.32703834852532, + 7.740384615441791 + ], + [ + 0.555802317400229, + -2.2858445918671535, + 7.788461538390869 + ], + [ + 1.2233246240243516, + -2.0093477993044764, + 7.836538461607568 + ], + [ + 1.7596643219533266, + -1.5312648706676915, + 7.884615384561717 + ], + [ + 2.104172809236037, + -0.9141590216151801, + 7.932692307725156 + ], + [ + 2.2265026689855025, + -0.23688132364645745, + 7.980769230753871 + ], + [ + 2.128813163865374, + 0.42001202795148923, + 8.028846153851099 + ], + [ + 1.8414138448882706, + 0.9870132798580143, + 8.076923076922437 + ], + [ + 0.987013279858011, + 1.8414138448882098, + 8.173076923076875 + ], + [ + 0.420012027951521, + 2.128813163865906, + 8.22115384615648 + ], + [ + -0.23688132364686182, + 2.226502668983463, + 8.26923076922096 + ], + [ + -0.9141590216137264, + 2.104172809241313, + 8.31730769233036 + ], + [ + -1.531264870670311, + 1.7596643219434511, + 8.365384615346466 + ], + [ + -2.009347799301379, + 1.2233246240379547, + 8.413461538510797 + ], + [ + -2.2858445918695356, + 0.5558023173866748, + 8.461538461488567 + ], + [ + -2.327038348524108, + -0.16150280080508977, + 8.5096153846554 + ], + [ + -2.134282905455498, + -0.8414668189427993, + 8.557692307667162 + ], + [ + -1.7418755258613183, + -1.4068747452782566, + 8.605769230781075 + ], + [ + -1.20830487090241, + -1.8022915771940946, + 8.653846153842522 + ], + [ + -0.604152433382828, + -1.999999999999907, + 8.701923076923327 + ], + [ + 0.6041524333828305, + -2.0000000000000564, + 8.798076923077526 + ], + [ + 1.208304870902372, + -1.8022915771933377, + 8.846153846148837 + ], + [ + 1.7418755258609533, + -1.4068747452807895, + 8.894230769245528 + ], + [ + 2.134282905456969, + -0.8414668189369883, + 8.942307692278401 + ], + [ + 2.3270383485210635, + -0.16150280081474325, + 8.990384615428868 + ], + [ + 2.285844591873969, + 0.5558023173983309, + 9.038461538408193 + ], + [ + 2.0093477992963296, + 1.2233246240276605, + 9.086538461590958 + ], + [ + 1.5312648706749636, + 1.7596643219501886, + 9.134615384572934 + ], + [ + 0.91415902161026, + 2.1041728092378444, + 9.182692307720423 + ], + [ + 0.2368813236489844, + 2.2265026689849927, + 9.230769230754154 + ], + [ + -0.42001202795247133, + 2.1288131638652503, + 9.278846153852554 + ], + [ + -0.9870132798577462, + 1.8414138448885005, + 9.326923076921004 + ], + [ + -1.8414138448885735, + 0.9870132798574845, + 9.423076923079982 + ], + [ + -2.1288131638639047, + 0.42001202795476394, + 9.471153846136946 + ], + [ + -2.22650266898944, + -0.2368813236564224, + 9.519230769279703 + ], + [ + -2.104172809228791, + -0.9141590215942135, + 9.567307692207855 + ], + [ + -1.7596643219632289, + -1.5312648707004843, + 9.615384615539929 + ], + [ + -1.22332462401359, + -2.0093477992648854, + 9.663461538271 + ], + [ + -0.5558023174105057, + -2.2858445919045973, + 9.711538461725837 + ], + [ + 0.16150280082377924, + -2.3270383484972044, + 9.759615384466972 + ], + [ + 0.8414668189311059, + -2.1342829054719186, + 9.80769230778639 + ], + [ + 1.4068747452839687, + -1.741875525853499, + 9.85576923072261 + ], + [ + 1.8022915771920602, + -1.2083048709051603, + 9.903846153863118 + ], + [ + 2.0000000000003317, + -0.6041524333822196, + 9.951923076919346 + ], + [ + 2.0, + -5.047582789074024e-15, + 10.000000000000002 + ] + ], + "weights": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "knots": [ + 0.0, + 3.97641570722958, + 7.95283141445916, + 11.92924712168874, + 15.90566282891832, + 19.8820785361479, + 23.85849424337748, + 27.83490995060706, + 31.81132565783664, + 35.787741365066225, + 39.7641570722958, + 43.74057277952538, + 47.71698848675496, + 51.693404193984534, + 55.66981990121412, + 59.6462356084437, + 63.62265131567328 + ], + "multiplicities": [ + 14, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 14 + ], + "periodic": false + } + ], + "closed": false + }, + "inner_wires": [] + } + ], + "result_refs": [ + "s1" + ], + "b3d_volume": 35.642805167823504, + "b3d_volume_gk": 35.642805167823504, + "b3d_default_volume": 35.642681367230885, + "b3d_bbox": [ + -2.300012799317609, + -2.3000127993174146, + -0.2990547016451006, + 2.3000127993175012, + 2.3000127993174946, + 10.299054701644959 + ], + "solid_count": 1, + "b3d_status": "ok", + "unsupported": [], + "fixture_provenance": { + "source_stem": "50_spring", + "build123d_version": "0.13.0", + "source_kernel": "8.0.1.1", + "reference_volume_method": "Gauss-Kronrod, eps=1e-9, use_span=True" + } +} diff --git a/test/test_affine_geometry_isolation.py b/test/test_affine_geometry_isolation.py new file mode 100644 index 00000000..2daea3ef --- /dev/null +++ b/test/test_affine_geometry_isolation.py @@ -0,0 +1,25 @@ +"""Complex shared fillet geometry must survive nonuniform scale without a crash.""" +import json +from pathlib import Path +import sys + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "tools/research/build123dftc")) +from b3ftc.replay import replay_trace_to_ftc +from b3ftc.validation import _worker + + +def test_nonuniform_scale_after_spherical_cut_and_fillet(tmp_path): + trace = json.loads((ROOT / "test/build123d_traces/affine_trimmed_sphere.trace.json").read_text()) + source, meta = replay_trace_to_ftc(trace, stem="affine-shared-geometry") + assert meta["status"] == "ok" + path = tmp_path / "affine.ftc.py" + path.write_text(source) + # A native kernel regression can segfault. Keep the test runner alive and + # report it as a failing feature, exactly like the external acceptance tool. + metrics = _worker(path, tmp_path / "work", 30, None, sys.executable, None) + assert metrics["status"] == "ok", metrics + assert metrics["is_valid"] is True + assert metrics["volume"] == pytest.approx(trace["b3d_volume"], rel=1e-6) diff --git a/test/test_build123d_cli.py b/test/test_build123d_cli.py new file mode 100644 index 00000000..7271c482 --- /dev/null +++ b/test/test_build123d_cli.py @@ -0,0 +1,88 @@ +"""The pure stage-2 boundary and batch input discovery contracts.""" +import importlib.util +import json +import sys +from pathlib import Path + +import pytest + +TOOLS = Path(__file__).resolve().parents[1] / "tools/research/build123dftc" +sys.path.insert(0, str(TOOLS)) + + +def _script(name): + spec = importlib.util.spec_from_file_location(name, TOOLS / f"{name}.py") + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def test_translate_writes_reviewable_source_and_sidecars(tmp_path): + payload = {"schema_version": "1.0", "stem": "box", "b3d_status": "ok", + "unsupported": [], "steps": [{"id": "base", "op": "box", "inputs": [], + "parameters": {"length": 10, "width": 8, "height": 4}}], + "result_refs": ["base"], "b3d_volume": 320, + "b3d_bbox": [0, 0, 0, 10, 8, 4], "solid_count": 1} + trace = tmp_path / "box.trace.json" + trace.write_text(json.dumps(payload)) + stem, source, meta = _script("build123d_to_ftc").translate_trace_file(trace, tmp_path / "out") + assert stem == "box" + assert meta["status"] == "ok" + assert "feature:" in source and "make_box_rsolid" in source + assert (tmp_path / "out/box.ftc.py").exists() + assert (tmp_path / "out/box.meta.json").exists() + assert (tmp_path / "out/box.sketches.json").exists() + + +@pytest.mark.parametrize("stem", ["../escape", "/absolute", "..", "nested/file"]) +def test_trace_cannot_write_outside_output_directory(tmp_path, stem): + trace = tmp_path / "bad.trace.json" + trace.write_text(json.dumps({"schema_version": "1.0", "stem": stem, "steps": []})) + with pytest.raises(ValueError): + _script("build123d_to_ftc").translate_trace_file(trace, tmp_path / "out") + assert not (tmp_path / "out").exists() + + +def test_future_schema_is_not_silently_reinterpreted(tmp_path): + trace = tmp_path / "bad.trace.json" + trace.write_text(json.dumps({"schema_version": "999", "steps": []})) + with pytest.raises(ValueError, match="schema"): + _script("build123d_to_ftc").translate_trace_file(trace, tmp_path / "out") + + +def test_manifest_resolves_only_declared_models(tmp_path): + models = tmp_path / "models" + models.mkdir() + for name in ("one.py", "two.py", "extra.py"): + (models / name).write_text("") + manifest = tmp_path / "manifest.json" + manifest.write_text(json.dumps({"examples": [{"file": "models/one.py"}, {"file": "models/two.py"}]})) + actual = _script("build123d_trace").discover_inputs(manifest=manifest) + assert [p.name for p in actual] == ["one.py", "two.py"] + + +@pytest.mark.parametrize("timeout", ["nan", "inf", "0", "-1"]) +def test_capture_rejects_unbounded_or_invalid_timeouts(timeout): + with pytest.raises(SystemExit) as error: + _script("build123d_trace").main(["--input", "unused.py", "--timeout", timeout]) + assert error.value.code == 2 + + +def test_validator_cli_reports_failure_with_nonzero_exit(tmp_path, monkeypatch): + module = _script("build123d_validate") + report = {"rows": [{"stem": "broken", "quality": "rejected", "build": "build_error", + "reasons": ["build_failed"]}], + "counts": {"accepted": 0, "partial": 0, "rejected": 1}} + monkeypatch.setattr(module, "validate_directory", lambda *a, **kw: report) + output = tmp_path / "report.json" + assert module.main(["--ftc-dir", str(tmp_path), "--traces-dir", str(tmp_path), + "--report", str(output)]) == 1 + assert json.loads(output.read_text())["counts"]["rejected"] == 1 + + +@pytest.mark.parametrize("timeout", ["nan", "inf", "-1", "0"]) +def test_validator_cli_rejects_nonfinite_or_nonpositive_timeout(tmp_path, timeout): + with pytest.raises(SystemExit) as exc: + _script("build123d_validate").main(["--ftc-dir", str(tmp_path), "--traces-dir", str(tmp_path), + "--timeout", timeout]) + assert exc.value.code == 2 diff --git a/test/test_build123d_trace.py b/test/test_build123d_trace.py new file mode 100644 index 00000000..dfb5b0ad --- /dev/null +++ b/test/test_build123d_trace.py @@ -0,0 +1,229 @@ +"""Feature tracing regressions, independent of the SimpleCAD runtime.""" +from pathlib import Path +import copy +import json +import sys + +import pytest + +b = pytest.importorskip("build123d") +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "tools/research/build123dftc")) +from b3ftc.geometry import edge as transcribe_edge +from b3ftc.geometry import fingerprint +from b3ftc.tracer import trace_source + + +def checked(source): + trace = trace_source(source) + assert trace["b3d_status"] == "ok", trace["error"] + assert trace["unsupported"] == [] + known = set() + for step in trace["steps"]: + assert set(step["inputs"]) <= known + known.add(step["id"]) + assert set(trace["result_refs"]) <= known + json.dumps(trace, allow_nan=False) + return trace + + +def test_builder_profile_is_actual_placed_face_with_hole(): + trace = checked("""from build123d import * +with BuildPart() as bp: + with BuildSketch(Plane.XY.offset(7)): + Rectangle(10, 8) + Circle(2, mode=Mode.SUBTRACT) + extrude(amount=3) +result = bp.part +""") + feature = next(s for s in trace["steps"] if s["op"] == "extrude") + assert len(feature["profile"]["wires"]) == 2 + assert feature["profile"]["origin"][2] == pytest.approx(7) + assert trace["b3d_bbox"][2::3] == pytest.approx([7, 10]) + assert trace["b3d_volume"] == pytest.approx((80 - 4 * 3.141592653589793) * 3) + + +def test_algebra_has_boolean_dependencies_and_transform_snapshots(): + trace = checked("""from build123d import * +base = Box(10, 10, 10) +base.move(Location((3, 0, 0))) +result = base - Pos(3, 0, 0) * Cylinder(2, 20) +""") + assert trace["steps"][-1]["op"] == "cut" + assert len(trace["steps"][-1]["inputs"]) == 2 + transform = [s for s in trace["steps"] if s["op"] == "transform"] + assert transform[0]["result"]["bbox"][0] == -5 + assert transform[1]["result"]["bbox"][0] == -2 + assert trace["b3d_volume"] == pytest.approx(1000 - 40 * 3.141592653589793) + + +def test_nested_builder_publication_is_captured_once(): + trace = checked("""from build123d import * +with BuildPart(Plane.XY.offset(10)) as bp: + with Locations((4, 0, 0)): + Box(2, 2, 2) +result = bp.part +""") + assert len([s for s in trace["steps"] if s["op"] == "box"]) == 1 + assert trace["b3d_bbox"] == pytest.approx([3, -1, 9, 5, 1, 11]) + + +def test_deepcopy_mirror_preserves_feature_reference(): + trace = checked("""from build123d import * +import copy +original = Solid.make_box(2, 3, 4) +result = copy.deepcopy(original).mirror(Plane.YZ) +""") + assert [s["op"] for s in trace["steps"]] == ["box", "transform"] + assert trace["b3d_bbox"] == pytest.approx([-2, 0, 0, 0, 3, 4]) + + +def test_multiple_solid_components_and_union_groups(): + trace = checked("""from build123d import * +a = Solid.make_box(1, 1, 1) +b = Solid.make_box(1, 1, 1).moved(Location((3, 0, 0))) +group = a.fuse(b).moved(Location((0, 0, 2))) +result = group.solids()[0].moved(Location((0, 2, 0))) +""") + union = next(s for s in trace["steps"] if s["op"] == "union") + assert union["result"]["solid_count"] == 2 + assert len(union["result_groups"]) == 2 + assert all(group for group in union["result_groups"]) + assert any(s["op"] == "component" for s in trace["steps"]) + assert trace["b3d_volume"] == pytest.approx(1) + + +def test_selection_fingerprints_for_fillet_and_shell(): + trace = checked("""from build123d import * +with BuildPart() as bp: + Box(10, 10, 10) + fillet(bp.edges().filter_by(Axis.Z), 1) + offset(amount=-.5, openings=bp.faces().sort_by(Axis.Z)[-1]) +result=bp.part +""") + fillet = next(s for s in trace["steps"] if s["op"] == "fillet") + shell = next(s for s in trace["steps"] if s["op"] == "offset") + assert len(fillet["selection"]) == 4 + assert shell["selection"][0]["kind"] == "face" + assert "normal" in shell["selection"][0] + + +def test_trimmed_spline_retains_exact_control_points(): + original = b.Edge.make_spline([(0, 0), (1, 2), (3, 1), (4, 0)]) + trimmed = original.trim(.2, .8) + encoded = transcribe_edge(trimmed) + assert encoded["kind"] == "bspline" + assert encoded["start"] == pytest.approx(tuple(trimmed.position_at(0))) + assert encoded["end"] == pytest.approx(tuple(trimmed.position_at(1))) + assert encoded["poles"][0] == pytest.approx(encoded["end"] if encoded["reversed"] else encoded["start"]) + + +def test_absolute_location_assignment_and_exact_conic_trim(): + trace = checked("""from build123d import * +result = Solid.make_box(2,3,4).moved(Location((2,0,0))) +result.location = Location((5,0,0)) +""") + assert trace["b3d_bbox"][0] == pytest.approx(5) + assert trace["steps"][-1]["parameters"]["matrix"][0][3] == pytest.approx(3) + conic = b.Edge.make_ellipse(3, 2, start_angle=10, end_angle=150) + data = transcribe_edge(conic) + assert data["kind"] == "bspline" + assert data["degree"] == 2 + assert any(weight != 1 for weight in data["weights"]) + + +def test_curved_selection_center_is_mass_center_and_no_arbitrary_surface_normal(): + arc = b.Edge.make_three_point_arc((1, 0), (0, 1), (-1, 0)) + data = fingerprint(arc) + assert data["center"] == pytest.approx(tuple(arc.center(b.CenterOf.MASS))) + assert data["center"] != pytest.approx(tuple(arc.center())) + sphere = b.Solid.make_sphere(2) + curved = fingerprint(sphere.faces()[0]) + assert "normal" not in curved + + +def test_scaling_resolves_actual_default_location_center(): + trace = checked("""from build123d import * +placed = Solid.make_box(2,3,4).moved(Location((10,0,0))) +result = placed.scale(2) +""") + assert trace["steps"][-1]["parameters"]["about"] == pytest.approx([10, 0, 0]) + assert trace["b3d_bbox"] == pytest.approx([10, 0, 0, 14, 6, 8]) + + +def test_factory_parameters_partial_angles_and_generator_inputs_are_preserved(): + trace = checked("""from build123d import * +a = Solid.make_cylinder(2,3,angle=120) +b = Solid.make_cone(3,1,4,angle=180).moved(Location((10,0,0))) +c = Solid.make_torus(5,1,start_angle=-30,end_angle=80,major_angle=140).moved(Location((20,0,0))) +result = a.fuse(b,c) +""") + assert next(s for s in trace["steps"] if s["op"] == "cylinder")["parameters"]["angle"] == 120 + torus = next(s for s in trace["steps"] if s["op"] == "torus") + assert torus["parameters"]["major_angle"] == 140 + trace = checked("""from build123d import * +wires = (Wire.make_circle(r, plane=Plane.XY.offset(z)) for r,z in [(2,0),(3,5)]) +result = Solid.make_loft(wires) +""") + assert len(trace["steps"][-1]["profiles"]) == 2 + + +def test_draft_is_transcribed_and_nonplanar_thicken_reports_surface_boundary(): + trace = checked("""from build123d import * +body = Solid.make_box(5,5,5) +side = body.faces().filter_by(Plane.YZ)[-1] +result = body.draft([side], Plane.XY, 5) +""") + draft = trace["steps"][-1] + assert draft["op"] == "draft" + assert len(draft["selection"]) == 1 + assert draft["parameters"]["neutral_plane"]["normal"] == [0, 0, 1] + trace = trace_source("""from build123d import * +face = Solid.make_sphere(2).faces()[0] +result = Solid.thicken(face, .2) +""") + assert trace["unsupported"] + assert any(s["op"] == "thicken" and "geometry_error" in s for s in trace["steps"]) + + +def test_unknown_kernel_solid_is_reported_and_errors_restore_patches(): + original = b.Solid.make_box.__func__ + owned_attributes = set(b.Solid.__dict__) + trace = trace_source("""from build123d import Solid +from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox +result = Solid(BRepPrimAPI_MakeBox(2, 3, 4).Solid()) +""") + assert trace["unsupported"] + assert trace["steps"][-1]["op"] == "unsupported" + assert b.Solid.make_box.__func__ is original + trace = trace_source("from build123d import *\nresult=Box(1,2,3)\nraise RuntimeError('expected')") + assert trace["b3d_status"] == "error" + assert "expected" in trace["error"] + assert b.Solid.make_box.__func__ is original + assert set(b.Solid.__dict__) == owned_attributes + + +def test_rational_circle_volume_uses_span_aware_adaptive_integration(): + trace = checked("""from build123d import * +from math import sqrt +points = [(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1),(1,0)] +weights = [1,sqrt(.5),1,sqrt(.5),1,sqrt(.5),1,sqrt(.5),1] +curve = Edge.make_bspline(points,[0,0,0,1,1,2,2,3,3,4,4,4],2,weights) +result = Solid.extrude(Face(Wire([curve])), (0,0,1)) +""") + assert trace["b3d_volume"] == pytest.approx(3.141592653589793, rel=1e-9) + assert trace["b3d_area"] == pytest.approx(4 * 3.141592653589793, rel=1e-9) + assert "b3d_default_volume" in trace + assert trace["steps"][-1]["profile"]["wires"][0]["edges"][0]["kind"] == "bspline" + + +def test_multiple_intersection_results_reference_individual_components(): + trace = checked("""from build123d import * +base = Solid.make_box(10,2,2) +left = Solid.make_box(2,4,4) +right = Solid.make_box(2,4,4).moved(Location((8,0,0))) +intersection = base.intersect(left.fuse(right)) +result = intersection[0].moved(Location((0,10,0))) +""") + assert any(s["op"] == "component" for s in trace["steps"]) + assert trace["solid_count"] == 1 + assert trace["b3d_volume"] == pytest.approx(8) diff --git a/test/test_build123d_translation_output.py b/test/test_build123d_translation_output.py new file mode 100644 index 00000000..260a4c01 --- /dev/null +++ b/test/test_build123d_translation_output.py @@ -0,0 +1,271 @@ +"""Format and executable geometry tests for build123d FTC translation. + +Fixtures model the trace protocol without depending on build123d itself. +""" +from __future__ import annotations +import importlib.util +import math +import re +import sys +import tempfile +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / 'tools/research/build123dftc')) +from b3ftc.replay import replay_trace_to_ftc + + +def rectangle(x=10, y=6, z=0): + points = [(0, 0, z), (x, 0, z), (x, y, z), (0, y, z)] + return {'origin': (0, 0, z), 'u': (1, 0, 0), 'v': (0, 1, 0), + 'normal': (0, 0, 1), 'wires': [{'edges': [ + {'kind': 'line', 'start': a, 'end': b} + for a, b in zip(points, points[1:] + points[:1])]}]} + + +def circle(radius, z=0): + return {'origin': (0, 0, z), 'u': (1, 0, 0), 'v': (0, 1, 0), + 'normal': (0, 0, 1), 'wires': [{'edges': [ + {'kind': 'circle', 'center': (0, 0, z), 'radius': radius, + 'normal': (0, 0, 1), 'x_dir': (1, 0, 0)}]}]} + + +def trace(*steps): + return {'schema_version': '1.0', 'steps': list(steps), + 'result_refs': [steps[-1]['id']], 'unsupported': []} + + +class FormatTests(unittest.TestCase): + def test_vertex_loft_sections_use_keyword_arguments(self): + source, meta = replay_trace_to_ftc(trace({'id': 's1', 'op': 'loft', + 'profiles': [circle(2), {'kind': 'vertex', 'point': (0, 0, 5)}], + 'parameters': {'ruled': True}}), stem='pointed') + self.assertEqual(meta['status'], 'ok', meta) + self.assertIn('scad.make_point_rvertex(x=0, y=0, z=5)', source) + + def test_real_recorded_fixtures_need_no_build123d_dependency(self): + for path in sorted((ROOT / 'test/build123d_traces').glob('*.trace.json')): + with self.subTest(fixture=path.name): + import json + source, meta = replay_trace_to_ftc(json.loads(path.read_text()), stem=path.stem) + self.assertEqual(meta['status'], 'ok', meta['unsupported']) + compile(source, str(path), 'exec') + self.assertNotIn('import build123d', source) + self.assertNotIn('load_brep', source) + def test_sketch_extrusion_and_explicit_module_contract(self): + source, meta = replay_trace_to_ftc(trace({'id': 's1', 'op': 'extrude', + 'profile': rectangle(), 'parameters': {'direction': (0, 0, 1), 'distance': 4}}), stem='plate') + self.assertEqual(meta['status'], 'ok', meta) + self.assertIn('scad.make_sketch_rsketch(', source) + self.assertIn('scad.make_face_from_sketch_rface(', source) + self.assertIn('scad.extrude_rsolid(', source) + self.assertIn("project_root=Path(__file__).parent", source) + self.assertIn('BODIES = list(bodies)', source) + self.assertRegex(source, r'feature: extrude \(build, profile=geometry\)') + for text in ('import build123d', 'import OCP', 'load_brep', '.get_edges()', '.get_faces()'): + self.assertNotIn(text, source) + compile(source, '', 'exec') + + def test_unknown_feature_blocks_dependents(self): + source, meta = replay_trace_to_ftc(trace({'id': 's1', 'op': 'unknown'}, + {'id': 's2', 'op': 'translate', 'inputs': ['s1'], 'parameters': {'vector': (1, 0, 0)}}), stem='unknown') + self.assertEqual(meta['status'], 'partial') + self.assertTrue(any('unknown' in str(x) for x in meta['unsupported'])) + self.assertIn('feature tree produced no solid', source) + + def test_modifiers_use_individual_fingerprints(self): + payload = trace({'id': 's1', 'op': 'box', 'parameters': {'length': 10, 'width': 10, 'height': 10}}, + {'id': 's2', 'op': 'fillet', 'inputs': ['s1'], 'parameters': {'radius': 1}, + 'selection': [{'kind': 'edge', 'geom_type': 'LINE', 'center': [0, 0, 5], 'length': 10, 'area': 0}]}) + source, meta = replay_trace_to_ftc(payload, stem='filleted') + self.assertEqual(meta['status'], 'ok', meta) + self.assertIn('ql.edges()', source) + self.assertIn('.take(1).exactly(1)', source) + self.assertIn("ql.prop('geom.length'", source) + self.assertIn('scad.fillet_rsolid(', source) + self.assertNotIn('geom.area', source) + + def test_no_final_snapshot_fallback(self): + source, meta = replay_trace_to_ftc({'steps': [], 'final_brep': 'ignored'}, stem='empty') + self.assertEqual(meta['status'], 'partial') + self.assertNotIn('ignored', source) + self.assertNotIn('load_brep', source) + + def test_explicit_empty_results_do_not_promote_unused_tool(self): + payload = trace({'id': 's1', 'op': 'box', 'parameters': {'length': 1, 'width': 2, 'height': 3}}) + payload['result_refs'] = [] + source, meta = replay_trace_to_ftc(payload) + self.assertEqual(meta['status'], 'partial') + self.assertIn('feature tree produced no solid', source) + + def test_draft_uses_face_predicate_and_neutral_plane(self): + payload = trace({'id': 's1', 'op': 'box', 'parameters': {'length': 2, 'width': 2, 'height': 3}}, + {'id': 's2', 'op': 'draft', 'inputs': ['s1'], 'parameters': {'angle': 5, + 'neutral_plane': {'origin': (0, 0, 0), 'normal': (0, 0, 1)}}, + 'selection': [{'kind': 'face', 'geom_type': 'PLANE', 'center': (2, 1, 1.5), 'area': 6, 'length': 0}]}) + source, meta = replay_trace_to_ftc(payload) + self.assertEqual(meta['status'], 'ok', meta) + self.assertIn('scad.draft_rsolid(', source) + self.assertIn('faces_to_draft=ql.faces()', source) + self.assertNotIn('geom.length', source) + compile(source, '', 'exec') + + +class GeometryTests(unittest.TestCase): + def test_real_recorded_fixtures_reconcile(self): + import json + for path in sorted((ROOT / 'test/build123d_traces').glob('*.trace.json')): + with self.subTest(fixture=path.name): + payload = json.loads(path.read_text()) + self.build(payload, payload['b3d_volume']) + def build(self, payload, expected, *, constraints_mode=False): + source, meta = replay_trace_to_ftc(payload, stem='geometry', constraints_mode=constraints_mode) + self.assertEqual(meta['status'], 'ok', meta) + with tempfile.TemporaryDirectory() as tmp: + path = Path(tmp) / 'model.ftc.py' + path.write_text(source) + spec = importlib.util.spec_from_file_location('ftc_geometry_' + path.parent.name, path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + module.build() + self.assertEqual(len(module.BODIES), payload.get('solid_count', 1)) + from OCP.BRepCheck import BRepCheck_Analyzer + self.assertTrue(all(BRepCheck_Analyzer(body.wrapped).IsValid() for body in module.BODIES)) + from OCP.BRepGProp import BRepGProp + from OCP.GProp import GProp_GProps + def accurate_volume(body): + props = GProp_GProps() + BRepGProp.VolumePropertiesGK_s(body.wrapped, props, 1e-9, True, True) + return float(props.Mass()) + volume = sum(accurate_volume(body) for body in module.BODIES) + self.assertAlmostEqual(volume, expected, delta=max(abs(expected), 1) * 1e-6) + + def test_extruded_rectangle(self): + self.build(trace({'id': 's1', 'op': 'extrude', 'profile': rectangle(), + 'parameters': {'direction': (0, 0, 1), 'distance': 4}}), 240) + + def test_recovered_constraints_preserve_rectangle_geometry(self): + payload = trace({'id': 's1', 'op': 'extrude', 'profile': rectangle(), + 'parameters': {'direction': (0, 0, 1), 'distance': 4}}) + self.build(payload, 240, constraints_mode=True) + source, meta = replay_trace_to_ftc(payload, constraints_mode=True) + self.assertTrue(meta['sketches']) + self.assertEqual(meta['constraint_recovery'][0]['status'], 'riveted') + self.assertIn('scad.constrain_', source) + + def test_face_with_circle_hole(self): + profile = circle(5) + profile['wires'].extend(circle(2)['wires']) + self.build(trace({'id': 's1', 'op': 'extrude', 'profile': profile, + 'parameters': {'direction': (0, 0, -1), 'distance': 3}}), math.pi * 21 * 3) + + def test_clockwise_polygon_hole_is_subtractive(self): + profile = circle(5) + points = [(2, -1, 0), (-2, -1, 0), (-2, 1, 0), (2, 1, 0)] + profile['wires'].append({'edges': [{'kind': 'line', 'start': a, 'end': b} + for a, b in zip(points, points[1:] + points[:1])]}) + self.build(trace({'id': 's1', 'op': 'extrude', 'profile': profile, + 'parameters': {'direction': (0, 0, 1), 'distance': 3}}), (math.pi * 25 - 8) * 3) + + def test_explicit_boolean_cut(self): + self.build(trace({'id': 's1', 'op': 'box', 'parameters': {'length': 10, 'width': 10, 'height': 5}}, + {'id': 's2', 'op': 'cylinder', 'parameters': {'radius': 2, 'height': 5, 'origin': (5, 5, 0)}}, + {'id': 's3', 'op': 'cut', 'inputs': ['s1', 's2']}), 500 - math.pi * 20) + + def test_loft_circle_sections(self): + self.build(trace({'id': 's1', 'op': 'loft', 'profiles': [circle(2), circle(4, 6)], + 'parameters': {'ruled': True}}), math.pi * 6 * (4 + 8 + 16) / 3) + + def test_native_multisection_sweep(self): + self.build(trace({'id': 's1', 'op': 'sweep_multi', 'profiles': [circle(2), circle(4, 6)], + 'path': {'edges': [{'kind': 'line', 'start': (0, 0, 0), 'end': (0, 0, 6)}]}, + 'parameters': {'is_frenet': False}}), 56 * math.pi) + + def test_native_tapered_extrusion(self): + top_radius = 4 - 6 * math.tan(math.radians(15)) + self.build(trace({'id': 's1', 'op': 'extrude_taper', 'profile': circle(4), + 'parameters': {'direction': (0, 0, 6), 'taper': 15}}), + math.pi * 6 * (16 + 4 * top_radius + top_radius ** 2) / 3) + + def test_native_until_extrusion(self): + self.build(trace({'id': 's1', 'op': 'box', + 'parameters': {'length': 10, 'width': 10, 'height': 3, 'origin': (-5, -5, 5)}}, + {'id': 's2', 'op': 'extrude_until', 'inputs': ['s1'], 'profile': circle(1), + 'parameters': {'direction': (0, 0, 1), 'until': 'NEXT'}}), 5 * math.pi) + + def test_native_twisted_extrusion(self): + self.build(trace({'id': 's1', 'op': 'extrude_twist', 'profile': rectangle(), + 'parameters': {'normal': (0, 0, 4), 'center': (0, 0, 0), 'angle': 90}}), 240) + + def test_affine_shear_preserves_volume(self): + self.build(trace({'id': 's1', 'op': 'box', 'parameters': {'length': 10, 'width': 6, 'height': 4}}, + {'id': 's2', 'op': 'transform', 'inputs': ['s1'], 'parameters': {'matrix': [ + [1, .5, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]}}), 240) + + def test_both_split_preserves_original_component_order(self): + self.build(trace({'id': 's1', 'op': 'box', + 'parameters': {'length': 2, 'width': 3, 'height': 8}, + 'result': {'bbox': [0, 0, 0, 2, 3, 8], 'solid_count': 1}}, + {'id': 's2', 'op': 'split', 'inputs': ['s1'], + 'parameters': {'tool': {'origin': (0, 0, 2), 'normal': (0, 0, 1)}, 'keep': 'BOTH'}, + 'result_component_sides': ['BOTTOM', 'TOP']}, + {'id': 's3', 'op': 'component', 'inputs': ['s2'], 'parameters': {'index': 0}}), 12) + + def test_exact_ellipse_sketch(self): + profile = circle(2) + profile['wires'][0]['edges'] = [{'kind': 'ellipse', 'center': (0, 0, 0), + 'major_radius': 4, 'minor_radius': 2, 'x_dir': (1, 0, 0), 'y_dir': (0, 1, 0)}] + self.build(trace({'id': 's1', 'op': 'extrude', 'profile': profile, + 'parameters': {'direction': (0, 0, 1), 'distance': 3}}), math.pi * 8 * 3) + + def test_translate_preserves_volume(self): + self.build(trace({'id': 's1', 'op': 'sphere', 'parameters': {'radius': 3}}, + {'id': 's2', 'op': 'translate', 'inputs': ['s1'], 'parameters': {'vector': (5, -8, 2)}}), 36 * math.pi) + + def test_partial_cylinder(self): + self.build(trace({'id': 's1', 'op': 'cylinder', + 'parameters': {'radius': 3, 'height': 4, 'angle': 180}}), 18 * math.pi) + + def test_partial_cone(self): + self.build(trace({'id': 's1', 'op': 'cone', + 'parameters': {'base_radius': 3, 'top_radius': 0, 'height': 4, 'angle': 90}}), 3 * math.pi) + + def test_partial_sphere(self): + self.build(trace({'id': 's1', 'op': 'sphere', + 'parameters': {'radius': 3, 'angle1': 0, 'angle2': 90, 'angle3': 360}}), 18 * math.pi) + + def test_closed_rational_spline_profile(self): + profile = circle(1) + poles = [(1, 0, 0), (1, 1, 0), (0, 1, 0), (-1, 1, 0), (-1, 0, 0), + (-1, -1, 0), (0, -1, 0), (1, -1, 0), (1, 0, 0)] + profile['wires'][0]['edges'] = [{'kind': 'bspline', 'poles': poles, 'degree': 2, + 'knots': [0, .25, .5, .75, 1], 'multiplicities': [3, 2, 2, 2, 3], + 'weights': [1, math.sqrt(.5), 1, math.sqrt(.5), 1, math.sqrt(.5), 1, math.sqrt(.5), 1], + 'start': poles[0], 'end': poles[-1]}] + self.build(trace({'id': 's1', 'op': 'extrude', 'profile': profile, + 'parameters': {'direction': [0, 0, 1], 'distance': 2}}), 2 * math.pi) + + def test_reversed_cubic_basis_preserves_entire_curve(self): + profile = circle(1) + poles = [(0, 0, 0), (0, 3, 0), (2, 4, 0), (4, 0, 0)] + profile['wires'][0]['edges'] = [{'kind': 'bezier', 'poles': poles, 'degree': 3, + 'start': poles[-1], 'end': poles[0], 'reversed': True}, + {'kind': 'line', 'start': poles[0], 'end': poles[-1]}] + # Exact Green-integral area of this cubic and its closing chord is 7.5. + self.build(trace({'id': 's1', 'op': 'extrude', 'profile': profile, + 'parameters': {'direction': [0, 0, 1], 'distance': 2}}), 15) + + def test_multi_body_is_complete_assembly(self): + payload = trace({'id': 's1', 'op': 'box', 'parameters': {'length': 2, 'width': 3, 'height': 4}}, + {'id': 's2', 'op': 'box', 'parameters': {'length': 4, 'width': 2, 'height': 3, 'origin': [20, 0, 0]}}, + {'id': 's3', 'op': 'compound', 'inputs': ['s1', 's2']}) + payload['solid_count'] = 2 + self.build(payload, 48) + source, meta = replay_trace_to_ftc(payload) + self.assertEqual(meta['artifact_type'], 'assembly') + self.assertIn('@scad.assemble(', source) + + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_build123d_unknown_api.py b/test/test_build123d_unknown_api.py new file mode 100644 index 00000000..711ef336 --- /dev/null +++ b/test/test_build123d_unknown_api.py @@ -0,0 +1,40 @@ +"""Unknown construction must remain visible instead of aliasing an old solid.""" +from pathlib import Path +import sys + +import pytest + +pytest.importorskip("build123d") +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "tools/research/build123dftc")) +from b3ftc.replay import replay_trace_to_ftc +from b3ftc.tracer import trace_source +from b3ftc.validation import compare_metrics + + +@pytest.mark.parametrize("statement", [ + "result = ConvexPolyhedron([(0,0,0),(1,0,0),(0,1,0),(0,0,1)])", + "result = Box(2,3,4).to_splines()", + "from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox\nresult = Solid(BRepPrimAPI_MakeBox(2,3,4).Solid())", +]) +def test_uninstrumented_api_cannot_silently_accept(statement): + trace = trace_source("from build123d import *\n" + statement) + assert trace["b3d_status"] == "ok", trace["error"] + assert trace["unsupported"], trace + assert any(step["op"] == "unsupported" for step in trace["steps"]) + _, metadata = replay_trace_to_ftc(trace) + assert metadata["status"] == "partial", metadata + actual = {"status": "ok", "volume": trace["b3d_volume"], + "bbox": trace["b3d_bbox"], "solid_count": trace["solid_count"], + "body_count": trace["solid_count"], "is_valid": True} + assert compare_metrics(trace, actual, metadata)["quality"] == "rejected" + + +def test_failed_source_rejects_even_after_valid_feature_was_created(): + trace = trace_source("from build123d import *\nresult=Box(2,3,4)\nraise RuntimeError('unknown operation')") + _, metadata = replay_trace_to_ftc(trace) + actual = {"status": "ok", "volume": 24, "bbox": [-1,-1.5,-2,1,1.5,2], + "solid_count": 1, "body_count": 1, "is_valid": True} + result = compare_metrics(trace, actual, metadata) + assert result["quality"] == "rejected" + assert "source_failed" in result["reasons"] diff --git a/test/test_build123d_validation.py b/test/test_build123d_validation.py new file mode 100644 index 00000000..c8547825 --- /dev/null +++ b/test/test_build123d_validation.py @@ -0,0 +1,215 @@ +"""Acceptance must reject missing evidence and geometric false positives.""" +from __future__ import annotations + +import json +import math +from pathlib import Path +import sys + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "tools/research/build123dftc")) +from b3ftc.validation import compare_metrics, validate_directory, validate_row + + +def expected(**changes): + trace = {"b3d_status": "ok", "b3d_volume": 1000.0, + "b3d_bbox": [-5, -5, 0, 5, 5, 10], "solid_count": 1, + "result_refs": ["s1"], "unsupported": []} + trace.update(changes) + return trace + + +def actual(**changes): + metrics = {"status": "ok", "volume": 1000.0, + "bbox": [-5, -5, 0, 5, 5, 10], "solid_count": 1, + "body_count": 1, "is_valid": True} + metrics.update(changes) + return metrics + + +META = {"status": "ok", "unsupported": []} + + +def test_matching_metrics_accepted(): + result = compare_metrics(expected(), actual(), META) + assert result["quality"] == "accepted", result + assert result["bbox_error"] == 0 + + +def test_reference_failure_reports_basic_geometry_separately(tmp_path, monkeypatch): + import b3ftc.validation as validation + ftc = tmp_path / "sample.ftc.py" + ftc.write_text("# worker is isolated by this test") + trace = tmp_path / "sample.trace.json" + trace.write_text(json.dumps(expected())) + ftc.with_name("sample.meta.json").write_text(json.dumps(META)) + monkeypatch.setattr(validation, "_worker", lambda *args, **kwargs: + actual(reference_status="error", reference_error="kernel comparison failed")) + row = validate_row(ftc, trace, reference_step=tmp_path / "reference.step") + assert row["quality"] == "rejected" + assert row["metrics_quality"] == "accepted" + assert row["metrics_reasons"] == [] + assert row["reasons"] == ["reference_error"] + + +def test_rational_circle_cylinder_has_mathematical_area_four_pi(): + from OCP.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire, BRepBuilderAPI_MakeFace + from OCP.BRepPrimAPI import BRepPrimAPI_MakePrism + from OCP.Geom import Geom_Circle + from OCP.GeomConvert import GeomConvert + from OCP.gp import gp_Ax2, gp_Pnt, gp_Dir, gp_Vec + from b3ftc._validate_worker import _area, _volume + + circle = Geom_Circle(gp_Ax2(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1)), 1) + spline = GeomConvert.CurveToBSplineCurve_s(circle) + assert spline.IsRational() + edge = BRepBuilderAPI_MakeEdge(spline).Edge() + wire = BRepBuilderAPI_MakeWire(edge).Wire() + face = BRepBuilderAPI_MakeFace(wire, True).Face() + solid = BRepPrimAPI_MakePrism(face, gp_Vec(0, 0, 1)).Shape() + # OCCT 7.9's continuity split adds about 7.7e-9 relative integration + # error here; this precision still detects the original 0.0028 error. + assert _area(solid) == pytest.approx(4 * math.pi, rel=1e-8) + assert _volume(solid) == pytest.approx(math.pi, rel=1e-9) + + +def test_reference_export_cannot_change_geometry_to_obtain_acceptance(): + metrics = actual(reference_status="ok", reference_volume=1000, + symmetric_difference_volume=0, roundtrip_actual_volume=900, + roundtrip_actual_bbox=[-5, -5, 0, 5, 5, 10], + roundtrip_actual_solid_count=1, roundtrip_actual_valid=True) + row = compare_metrics(expected(), metrics, META, require_reference=True) + assert row["quality"] == "rejected" + assert "reference_roundtrip_changed_geometry" in row["reasons"] + + +@pytest.mark.parametrize("changes", [ + {"b3d_status": "error"}, {"b3d_volume": None}, {"b3d_bbox": None}, + {"solid_count": None}, {"result_refs": []}, {"b3d_volume": math.nan}, + {"b3d_bbox": [0, 0, 0]}, {"unsupported": ["unsupported sweep"]}, +]) +def test_source_failure_or_missing_evidence_rejected(changes): + assert compare_metrics(expected(**changes), actual(), META)["quality"] == "rejected" + + +@pytest.mark.parametrize("metadata", [None, {}, {"status": "partial"}, + {"status": "ok", "unsupported": ["torus"]}, + {"status": "ok", "unknown": ["operation"]}, + {"status": "ok", "unknown_operations": 1}]) +def test_incomplete_conversion_never_accepted(metadata): + assert compare_metrics(expected(), actual(), metadata)["quality"] == "rejected" + + +@pytest.mark.parametrize("changes", [ + {"body_count": 0}, {"solid_count": 2}, {"is_valid": False}, + {"volume": None}, {"bbox": None}, {"volume": math.inf}, + {"bbox": [0, -5, 0, 10, 5, 10]}, +]) +def test_actual_failure_including_rigid_translation_rejected(changes): + assert compare_metrics(expected(), actual(**changes), META)["quality"] == "rejected" + + +def write_case(root: Path, stem: str, source: str, trace=None, metadata=None): + ftc_dir, traces_dir = root / "ftc", root / "traces" + ftc_dir.mkdir(exist_ok=True) + traces_dir.mkdir(exist_ok=True) + ftc = ftc_dir / (stem + ".ftc.py") + ftc.write_text(source) + trace_path = traces_dir / (stem + ".trace.json") + trace_path.write_text(json.dumps(trace or expected())) + ftc.with_name(stem + ".meta.json").write_text(json.dumps(metadata or META)) + return ftc, trace_path + + +def box_source(center_x=0): + return f'''from pathlib import Path +import simplecadapi as scad +BODIES = None +@scad.part(id='validation-box', project_root=Path(__file__).parent) +def build(): + global BODIES + body = scad.make_box_rsolid(10, 10, 10, bottom_face_center=({center_x}, 0, 0)) + BODIES = [body] + return body +''' + + +def test_worker_builds_real_topology_and_checks_position(tmp_path): + ftc, trace = write_case(tmp_path, "box", box_source()) + row = validate_row(ftc, trace, timeout=30) + assert row["quality"] == "accepted", row + assert row["ftc_solid_count"] == 1 + ftc.write_text(box_source(10)) + row = validate_row(ftc, trace, timeout=30) + assert row["quality"] == "rejected", row + assert "bbox_mismatch" in row["reasons"] + + +def test_no_bodies_cannot_fall_back_to_returned_part(tmp_path): + source = box_source().replace("BODIES = [body]", "BODIES = []") + ftc, trace = write_case(tmp_path, "empty", source) + row = validate_row(ftc, trace, timeout=30) + assert row["quality"] == "rejected", row + assert "empty_bodies" in row["reasons"] + + +def test_timeout_and_build_failure_do_not_stop_batch(tmp_path): + write_case(tmp_path, "a_timeout", "import time\ntime.sleep(100)\n") + write_case(tmp_path, "b_failure", "raise RuntimeError('model failure')\n") + write_case(tmp_path, "c_good", box_source()) + report = validate_directory(tmp_path / "ftc", tmp_path / "traces", timeout=8) + assert [row["quality"] for row in report["rows"]] == ["rejected", "rejected", "accepted"], report + assert report["rows"][0]["build"] == "timeout" + assert "model failure" in report["rows"][1]["error"] + + +def test_missing_trace_rejected_but_other_cases_continue(tmp_path): + ftc, trace = write_case(tmp_path, "a_missing", box_source()) + trace.unlink() + write_case(tmp_path, "b_good", box_source()) + report = validate_directory(ftc.parent, tmp_path / "traces", timeout=30) + assert report["counts"] == {"accepted": 1, "partial": 0, "rejected": 1} + + +def test_reference_step_detects_equal_volume_equal_bbox_different_holes(tmp_path): + from OCP.BRepAlgoAPI import BRepAlgoAPI_Cut + from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox, BRepPrimAPI_MakeCylinder + from OCP.gp import gp_Pnt, gp_Ax2, gp_Dir + from OCP.STEPControl import STEPControl_Writer, STEPControl_AsIs + from OCP.IFSelect import IFSelect_RetDone + + box = BRepPrimAPI_MakeBox(gp_Pnt(-5, -5, 0), 10, 10, 10).Shape() + hole = BRepPrimAPI_MakeCylinder(gp_Ax2(gp_Pnt(2, 0, 0), gp_Dir(0, 0, 1)), 1, 10).Shape() + reference = BRepAlgoAPI_Cut(box, hole).Shape() + step = tmp_path / "reference.step" + writer = STEPControl_Writer() + assert writer.Transfer(reference, STEPControl_AsIs) == IFSelect_RetDone + assert writer.Write(str(step)) == IFSelect_RetDone + source = box_source().replace("BODIES = [body]", "body = scad.cut_rsolid(body, scad.make_cylinder_rsolid(1, 10, bottom_face_center=(-2, 0, 0)))\n BODIES = [body]") + ftc, trace = write_case(tmp_path, "wrong_hole", source, + expected(b3d_volume=1000 - math.pi * 10)) + coarse = validate_row(ftc, trace, timeout=30) + assert coarse["quality"] == "accepted", coarse + strict = validate_row(ftc, trace, timeout=30, reference_step=step) + assert strict["quality"] == "rejected", strict + assert "symmetric_difference_mismatch" in strict["reasons"] + assert strict["symmetric_difference_volume"] > 60 + independent = validate_row(ftc, trace, timeout=30, reference_step=step, + reference_python=sys.executable) + assert independent["quality"] == "rejected", independent + assert independent["reference_kernel"] + assert "symmetric_difference_mismatch" in independent["reasons"] + ftc.write_text(source.replace("bottom_face_center=(-2, 0, 0)", "bottom_face_center=(2, 0, 0)")) + identical = validate_row(ftc, trace, timeout=30, reference_step=step, + reference_python=sys.executable) + assert identical["quality"] == "accepted", identical + assert identical["symmetric_difference_volume"] == pytest.approx(0) + + +def test_requested_missing_reference_rejected(tmp_path): + ftc, trace = write_case(tmp_path, "box", box_source()) + row = validate_row(ftc, trace, timeout=30, reference_step=tmp_path / "absent.step") + assert row["quality"] == "rejected", row + assert "reference_error" in row["reasons"] diff --git a/tools/research/build123dftc/API_RESEARCH.md b/tools/research/build123dftc/API_RESEARCH.md new file mode 100644 index 00000000..1e635d55 --- /dev/null +++ b/tools/research/build123dftc/API_RESEARCH.md @@ -0,0 +1,124 @@ +# build123d 0.13 API 与测试集调研 + +本调研针对工作区 `.venv` 中实际安装的 build123d 0.13.0,以及上层 `tests/manifest.json` 固定的 `v0.13.0`、提交 `38effd343e1508964673faf59300a5cc68fbedc1`。2026 年 10 月 7 日已联网核查对应版本的官方文档。清单是测试范围和实现检查表,不能当作已通过转换的声明。 + +## 完整公开入口清单 + +`api_coverage.json` 从实际安装包生成,包含以下范围: + +| 范围 | 数量 | 含义 | +| --- | ---: | --- | +| 包 `__all__` 导出 | 203 | 官方顶层公开入口 | +| 公开成员定义 | 540 | 按定义所属类去重,含可达继承方法、属性与建模运算符 | +| 类接口 | 138 | 导出类,加上 Shape、几何维度 mixin、Builder、BaseObjectMeta | +| 工作区模型 | 50 | manifest 中全部模型,逐项记录调用位置统计 | +| 模型使用的顶层调用 | 50 种 | 已排除 `__main__` 导出代码和恒为 False 的文档生成分支 | +| 顶层调用位置 | 454 | 源码静态位置数量,循环次数和运行时内部调用未展开 | + +顶层入口分类:32 个枚举,15 个常量或类型别名,3 个 builder,4 个位置阵列上下文,27 个曲线对象入口、15 个草图对象入口、11 个实体对象入口(均包含 Base 类),6 个图纸对象入口,23 个建模操作,12 个几何类入口,20 个直接拓扑入口,5 个装配关节,9 个导出入口,6 个导入入口,以及 15 个其他工具入口。 + +成员分类:40 个 `make_*` 等工厂、68 个直接特征方法、18 个变换方法、41 个代数运算符定义、4 个上下文生命周期方法、122 个属性,以及 247 个查询或工具方法。分类采用方法名和所属模块,不能替代逐方法的行为测试。底层 OCP/Python 标准类型的成员和下划线内部实现不算公开 API;专门列入了建模运算符。 + +重新生成: + +```bash +.venv/bin/python simplecadapi/tools/research/build123dftc/research/inspect_api.py \ + --manifest tests/manifest.json \ + --output simplecadapi/tools/research/build123dftc/api_coverage.json +``` + +清单内每条入口有签名、定义文件与行号,类接口指向去重后的成员定义。`conversion_status: unverified` 表示尚未通过该接口的转换验证。后续覆盖报告应区分“识别入口”“真正生成 SimpleCAD 特征”“几何验证通过”,不要把成功执行源脚本等同于转换成功。 + +生成器也接受 `--validation-report` 和 `--traces-dir`。指定严格验收报告后,`verified_sampled_usage` 仅表示列出的模型中执行过该入口且模型验收通过。矩阵保留模型名单与报告 SHA256;其他参数、模式和未执行分支仍未验证。方法证据使用 trace 的实际 `source`,不会仅凭同名方法就把整个继承接口标为通过。最终验收报告更新后需重新生成矩阵。 + +## 捕获结构与可行的扩展方案 + +builder 与 algebra 是建模方式,Direct API 是两者共用的拓扑层;顶层入口捕获和底层特征捕获可以互补。[官方 Direct API 说明](https://build123d.readthedocs.io/en/v0.13.0/direct_api_reference.html) + +当前实现选择 Direct API 层记录实体构造图,并在实体特征的输入边界转录草图轮廓。这覆盖两种建模方式,不需要改变 builder 的 Python frame。下文第一层是未来扩展原始对象/草图操作记录的方案,不是当前已实现的声明。`project / offset / make_hull` 等草图变化目前进入求解后的精确轮廓;不会逐项保留原草图操作。非平面 Face/Shell 曲面工厂、Vertex 终点放样以及清单中其他未验证 API 仍需单独检查,未支持构造必须显式报告。 + +### 第一层:可读的原建模操作 + +安装源码中 `build_common.BaseObjectMeta.__call__` 是全部内置 `BaseObject` 子类的统一入口。它能保留 `Box`、`Circle`、`Spline`、`Hole` 等原参数,也能接收自定义继承类;外层调用期间,内部建模需要防止被重复计入。23 个公开 operations 应全部登记。记录原参数以后,应展开 locations、默认参数以及隐式 pending faces/edges。 + +### 第二层:Direct API 特征与几何 + +工厂需要覆盖以下定义;方法会被继承,不能只包装 `Solid` 一种类: + +- `Edge.make_bezier / make_circle / make_constrained_arcs / make_constrained_lines / make_ellipse / make_parabola / make_hyperbola / make_helix / make_line / make_mid_way / make_spline / make_bspline / make_spline_approx / make_tangent_arc / make_three_point_arc`。 +- `Wire.make_circle / make_convex_hull / make_ellipse / make_polygon / make_rect`。 +- `Face.make_bezier_surface / make_gordon_surface / make_rect / make_surface / make_surface_from_array_of_points / make_surface_from_curves / make_surface_patch / make_holes`。 +- `Shell.make_loft`。 +- `Solid.make_box / make_cone / make_cylinder / make_loft / make_sphere / make_torus / make_wedge`。 +- `Compound.make_text / make_triad`。 +- `Shape / Mixin1D / Mixin2D / Mixin3D / Edge / Wire / Face / Shell / Solid / Compound` 各自声明的 `extrude`;其中部分重载返回不同维度,不能假定都是 Solid。 +- 3D 的 `extrude_taper / extrude_until / extrude_linear_with_rotation / revolve / sweep / sweep_multi / thicken / draft / fillet / chamfer / hollow / offset_3d / dprism`。 +- 2D/1D 的 `offset / offset_2d / fillet_2d / chamfer_2d / trim* / project* / split* / close / stitch / combine / wrap*`。 + +对于没有 SimpleCAD 同名原语的曲线构造(如受约束圆弧、Airfoil、BlendCurve),可把求解后的单条曲线分解为解析参数或精确 BSpline 定义,再以 SimpleCAD 曲线原语重建。需保留 poles、degree、weights、knots、multiplicities、periodic,以及区间/方向。这个方法保留草图和后续特征,而不是把最终实体导入当作转换。 + +### 第三层:组合、位置与查询 + +布尔定义分布在 `Shape`、`Compound` 与 `Mixin1D`。1D 的加法可能得到 Wire/Curve,不能按 3D union 发射。`Shape` 的 `fuse / cut / intersect` 是 builder 和 algebra 实际共用的接口,应按几何维度分派。 + +`Location.__mul__` 对 Shape 实际调用 `other.moved(self)`,`Plane.__mul__` 也进入位置变换。因此包装 `Shape.moved` 后已经能捕获大多数 algebra placement 和 builder 发布,不必再重复包装 `*`。`move / locate / location.setter` 是原位变更;`moved / located` 返回副本。原位变更应建立新节点,保留变更前的输入节点。`translate / rotate / scale / mirror / transformed / transform_shape / transform_geometry` 也需覆盖。 + +查询 API 大多数不用发射新的 FTC 操作,但查询结果必须用于源脚本继续执行。边/面选择器的结果应关联已有特征,再记录指纹或索引;不能把选中边的 repr 当作可重放参数。曲线的 `@ / % / ^` 分别参与求值和位置计算,记录最终 Vector/Location 参数即可。枚举、单位、字体和颜色也应有稳定的序列化。 + +## 0.13 builder 语义的两个关键陷阱 + +所有 builder 先在自身 XY 局部坐标中构造。`output_placements` 只在输出或退出后统一应用。对象构造时使用的 `Locations` 属于局部位置;builder 发布时另有外层 `publication_locations`。两种位置不能重复应用,尤其是嵌套 BuildPart、BuildSketch、BuildLine 和多个 face placement。[官方 builder 位置说明](https://build123d.readthedocs.io/en/v0.13.0/key_concepts_builder.html) + +本地源码 `Builder.__enter__` 用 Python frame 判断当前 builder 与父 builder 是否同一作用域。直接加 `__enter__` 或 `__init__` 包装函数会改变 frame,可能把嵌套 builder 误判为无父级。优先捕获 `_add_to_context`、`_PublicationService.place/publish`;如必须包装 enter/init,要保持原同作用域判定的含义,并测试函数内返回私有草图这种有意隔离的情况。 + +`Builder._add_to_context` 中拿到的 shapes 是 builder 的局部坐标,不能称为全局坐标。此处同时维护累计几何、pending faces/edges 和 Select.LAST/NEW 的变化历史。对截面依赖引用、用于扫掠的独立路径、多个离散实体,需要保留输入依赖图。 + +## 50 个模型真正考验的能力 + +最常出现的静态调用:BuildSketch 57,BuildPart 55,extrude 40,Circle 29,Rectangle 25,Locations 23,Box/Line 各 18,BuildLine 16,fillet 15,RegularPolygon 14,GridLocations 11,Plane 10。完整逐模型统计见 JSON。 + +以下模型需要独立回归,避免简单盒子通过造成覆盖错觉: + +| 模型 | 关键行为 | +| --- | --- | +| 09、10、11、18、29、45、46、47 | 边/面选择、3D 圆角与倒角、修改后的选择指纹 | +| 12、30、40、46、47 | 样条、Bezier、端点切向量、非直线轮廓及扫掠 | +| 13、41、49 | 普通孔、沉孔、锥孔、负向深度、自动贯穿深度、多位置 | +| 14、39、40、46、50 | pending 路径/截面、扫掠参数、曲线起点坐标系 | +| 16、17、20、21、22、24、27、37、38、43 | 不同 workplane、嵌套位置、旋转、偏移与 builder 发布 | +| 19、31、32、33、42、48 | 循环/函数生成阵列,以及源查询决定下一操作参数 | +| 23、29、44、46、47 | 旋转、放样、壁厚偏置、开口选择、多截面 | +| 34 | Text 的字体形状与字内孔,不能只重建外轮廓 | +| 36 | `extrude(until=Until.*)`,限界对象与方向 | +| 45 | section、面内孔与比例缩放 | +| 49 | 四个彼此独立的 BuildPart 输出组合为 Compound | +| 50 | 完全 algebra 模型:Helix、`path ^ 0`、位置相乘、显式 sweep 参数 | + +源码中被禁用的 SVG 文档导出和 `__main__` STEP 输出不属于建模转换测试,但导入/导出公开入口仍列在 API 清单。清单中的矩阵、关节、图纸类和未被这 50 个模型使用的几何操作,应通过额外小型行为用例逐项验证;50 个模型不等于全部 API 覆盖。 + +## SimpleCAD 对应关系与几何验证 + +现有目标原语已提供:线/圆/椭圆/三点圆弧/角度圆弧/精确样条/插值样条/螺旋、wire/face 构造、草图 2D 布尔、3D 原语、3D 布尔、拉伸/旋转/放样/扫掠、圆角/倒角/抽壳,以及曲面构造。可优先复用 `operators/geometry.py`、`features.py`、`boolean.py`、`transform.py` 和 cqftc 的选择指纹与重放模式。 + +每个测试应同时检查操作结构与几何:FTC 内必须存在实际构造特征和输入依赖,执行生成脚本时不依赖 build123d;体积、包围盒、实体数量和有效性应该与源模型一致。只有体积相同无法证明孔位置和姿态正确,建议再比较差集体积或对称差集,并在拓扑变化时用几何指纹选择。基准来源是执行源脚本所得结果或 manifest 的 STEP,不能把待检 FTC 的结果本身作为基准。 + +验收工具已实现独立进程与超时隔离,缺少指标、源执行失败、空 BODIES、无效实体、转换元数据中的 unsupported/unknown 都会拒绝。包围盒比较六个世界坐标而非仅比较尺寸。体积与 STEP 差集使用 `VolumePropertiesGK_s(..., Eps=1e-9, OnlyClosed=True, IsUseSpan=True)`;有理 BSpline 使用默认积分或普通自适应积分可能产生明显误差,所以源与目标必须用同一定义。 + +模型 28 揭示了内核差异:OCP 7.9 对实际形状与基准 STEP 的共同内部点判为 IN,却把 Common 计算为空、双向 Cut 留下全部体积。标准 ShapeFix 和微小 fuzzy 未解决。实际形状重新导出 STEP 后,独立 OCP 8.0.1.1 求得 Common 等于完整体积、双向 Cut 都为空。可选 `--reference-python` 因此让 FTC 在 SimpleCAD 环境中构建,同时在指定独立内核进程中对 STEP 做差集。实际 STEP 的读回体积、包围盒、有效性与实体数量也必须与 FTC 真实 BODIES 一致,验收门槛不变,报告记录两个内核与积分方法。 + +面积计算在独立的几何深拷贝上先按 C1 连续性切分积分区间,再用明确 `Eps` keyword 的自适应积分;不修改实际 FTC 或 STEP。半径 1、高度 1 的精确有理 BSpline 圆柱有面积 `4π`、体积 `π` 的独立数学测试。OCP 7.9 的测量区间切分在该例有约 `7.7e-9` 相对误差,数学测试精度为 `1e-8`,整模型验收门槛保持原值。 + +参考 STEP 的临时实际导出使用 trace `source_metadata.export_options` 中声明的参数曲线与精度模式;没有声明时用标准 `True / AVERAGE`。差集布尔在首次 Build 前统一使用输入实际 BRep 顶点/边容差与内核 `Precision.Confusion` 的最大值,记录该值,不逐级尝试容差。差集必须有效并通过原体积门槛。模型 46 的当前记录表明即使匹配 `False / GREATEST` 并使用该固定规则,跨内核差集仍可能无效;这种情况会报告 `reference_error`,不会将基础指标通过冒充严格 STEP 匹配通过。 + +验收 CLI 有任何 rejected/partial 或没有可验收案例时返回退出码 1,所有案例 accepted 才返回 0;NaN、Inf 与非正 timeout 会作为参数错误拒绝,报告仍保存每例拒绝原因。 + +确实不能转换的入口应报出明确 API 名、源位置与原因。允许用户显式选择近似曲线时,应报告近似误差并保持后续特征可修改。最终 BRep/STEP 导入只能作为明确标记的外部几何来源,不能用它把未覆盖操作伪装成成功 FTC 转换。 + +## 官方核查来源 + +- [Objects](https://build123d.readthedocs.io/en/v0.13.0/objects.html) +- [Operations](https://build123d.readthedocs.io/en/v0.13.0/operations.html) +- [Builder concepts](https://build123d.readthedocs.io/en/v0.13.0/key_concepts_builder.html) +- [Algebra concepts](https://build123d.readthedocs.io/en/v0.13.0/key_concepts_algebra.html) +- [Direct API reference](https://build123d.readthedocs.io/en/v0.13.0/direct_api_reference.html) +- [固定测试集上游提交](https://github.com/gumyr/build123d/tree/38effd343e1508964673faf59300a5cc68fbedc1) diff --git a/tools/research/build123dftc/BENCHMARK.md b/tools/research/build123dftc/BENCHMARK.md new file mode 100644 index 00000000..77d6b3cc --- /dev/null +++ b/tools/research/build123dftc/BENCHMARK.md @@ -0,0 +1,35 @@ +# 工作区 50 个模型实测 + +日期:2026-10-07。输入为相邻工作区 `tests/manifest.json` 中的 50 个官方 +build123d 模型,版本 0.13.0,源内核 OCP 8.0.1.1;FTC 在 +SimpleCADAPI 2.2.0b1 / OCP 7.9.3.1 中构建,参考 STEP 在独立 OCP 8 环境对账。 +运行命令见 [README.md](README.md)。 + +| 检查 | 结果 | +| --- | --- | +| 源模型执行、特征图捕获 | 50 / 50,未识别实体操作 0 | +| FTC 源码生成 | 50 / 50,410 个特征,无未翻译记录 | +| FTC 实际构建、内核有效性、实体数量 | 50 / 50 | +| 体积、表面积、世界包围盒 | 50 / 50 | +| 加入参考 STEP 双向差集的严格验收 | 49 / 50 | + +所有模型的最大相对体积误差为 `1.492e-6`,最大面积误差为 `1.092e-6`, +最大包围盒误差(相对于对应轴跨度)为 `2.778e-9`。均远低于 `1e-3` 的 +验收阈值。原始报告在本机 `out/validate.json`,逐模型源码在 `out/ftc`, +输入特征图在 `out/traces`。这些运行产物被 Git 忽略。 + +模型 `46_tea_cup` 构建成功且全部基础几何检查通过,体积相对误差约 +`1.45e-9`、世界包围盒一致。独立参考内核的 STEP 双向差集计算仍生成无效 +拓扑,因此保留 `reference_error`,严格验收判为拒绝。没有跳过该模型、 +改变差集门槛或把无效差集当作零。报告同时给出 `metrics_quality=accepted` +与 `quality=rejected`,批量 CLI 在这次严格验收中返回 1。 + +测试按先写断言再实现的方式推进,相关回归包括真实捕获、格式、几何、未知 +API、孤立进程崩溃、超时、同体积/同包围盒但孔位不同的反例、图重放以及 +既有 CQ / WHUCAD、草图、QL 测试。295 项相关用例通过,另有 35 个子测试。 +六个真实图 fixture 保存在 `test/build123d_traces`,普通 CI 不需要 build123d。 + +203 个顶层导出、540 个去重公开成员的清单与样例证据在 `api_coverage.json`。 +标为 `verified_sampled_usage` 的条目仅说明相应已验收样例使用过该 API, +不代表其全部参数组合或全部公开 API 都已通过转换。复杂曲面构造等未接入 +边界在 [API_RESEARCH.md](API_RESEARCH.md) 和转换 meta 中明确列出。 diff --git a/tools/research/build123dftc/README.md b/tools/research/build123dftc/README.md new file mode 100644 index 00000000..3ff8acf4 --- /dev/null +++ b/tools/research/build123dftc/README.md @@ -0,0 +1,147 @@ +# build123d → FTC 转换工具 + +把真实执行的 build123d 模型转换成本仓库现行 FTC Python:显式草图、实体 +特征、布尔和 QL 修改选择。组织方式沿用 `tools/research/cadqueryftc`,转换 +与验收分开。支持 Builder、代数写法及已接入的底层实体 API。 + +```text +trusted model.py → build123d_trace.py → trace.json +trace.json → build123d_to_ftc.py → ftc.py + meta.json + sketches.json +ftc.py + trace.json [+ reference STEP] → build123d_validate.py → validate.json +trace.json → build123d_profile.py → profile.json +``` + +捕获执行模型的 Python;只对可信源文件运行。模型的 `__main__` 分支不会运行, +可在顶层将最终形状绑定为 `result`。捕获和验收分别在隔离子进程执行,设置 +超时,一例失败仍处理后续文件。 + +## 环境 + +本次实测为 Python 3.12、build123d 0.13.0 / OCP 8.0.1.1,以及 +SimpleCADAPI 2.2.0b1 / OCP 7.9.3.1。两个内核的绑定不能混装在同一环境: + +```bash +# 在 SimpleCADAPI 仓库根目录运行。环境放在相邻工作区。 +uv venv ../.venv --python 3.12 +uv pip install --python ../.venv/bin/python 'build123d==0.13.0' +uv venv ../.venv-sca --python 3.12 +uv pip install --python ../.venv-sca/bin/python -e . 'cadquery-ocp==7.9.3.1' pytest +``` + +已有环境无需重建。翻译阶段是纯 Python,不导入 build123d 或 CAD 内核;启用 +约束恢复时才加载现有 CQ 的求解器。 + +## 单模型 + +```bash +../.venv/bin/python tools/research/build123dftc/build123d_trace.py \ + --input ../tests/models/01_rectangular_plate.py \ + --out tools/research/build123dftc/out/traces + +../.venv-sca/bin/python tools/research/build123dftc/build123d_to_ftc.py \ + --trace tools/research/build123dftc/out/traces/01_rectangular_plate.trace.json \ + --out tools/research/build123dftc/out/ftc + +../.venv-sca/bin/python tools/research/build123dftc/build123d_validate.py \ + --ftc-dir tools/research/build123dftc/out/ftc \ + --traces-dir tools/research/build123dftc/out/traces \ + --report tools/research/build123dftc/out/validate.json +``` + +`--constraints on` 从实际草图恢复推断约束,复用 `cqftc.constraints`。只有生产 +求解器确认坐标复现才插入约束;约束 ID 标记推断出处。椭圆、样条及耗时超限 +的草图在 `constraint_recovery` 中明确记录状态,其精确几何仍保留。 + +## 工作区 50 个模型 + +```bash +../.venv/bin/python tools/research/build123dftc/build123d_trace.py \ + --manifest ../tests/manifest.json \ + --out tools/research/build123dftc/out/traces --timeout 180 + +../.venv-sca/bin/python tools/research/build123dftc/build123d_to_ftc.py \ + --traces-dir tools/research/build123dftc/out/traces \ + --out tools/research/build123dftc/out/ftc + +../.venv-sca/bin/python tools/research/build123dftc/build123d_validate.py \ + --ftc-dir tools/research/build123dftc/out/ftc \ + --traces-dir tools/research/build123dftc/out/traces \ + --reference-step-dir ../tests/step --reference-python ../.venv/bin/python \ + --report tools/research/build123dftc/out/validate.json --timeout 180 + +../.venv-sca/bin/python tools/research/build123dftc/build123d_profile.py \ + --traces-dir tools/research/build123dftc/out/traces \ + --report tools/research/build123dftc/out/profile.json +``` + +也可用 `--inputs-dir` 处理目录中的 `.py` 文件,或用 `--input` 指定一个模型。 +每个模型产生 `.trace.json`、执行日志、`.ftc.py`、`.meta.json` 和 +`.sketches.json`。批量验收报告保留所有模型,缺少转换结果也计入失败。 + +## 验收依据 + +- 实际执行 FTC,检查非空实体、内核有效性、体积、表面积和实体数量。 +- 比较世界坐标中的六个包围盒边界;同尺寸但位置错误会失败。 +- 指定参考 STEP 时,要求两个方向几何差集的总体积通过检查。 +- `--reference-python` 让参考几何对账在指定内核执行,FTC 仍在 + SimpleCADAPI 环境构建。报告记录两个内核版本,并检查 STEP 导出往返的 + 体积、包围盒、有效性和实体数。 +- 体积使用按样条节点区间计算的 Gauss–Kronrod 积分。普通固定阶积分对有理 + 样条有明显误差,还会在某些非均匀缩放后的裁剪曲面上崩溃。 + +面积只在独立副本上切开不连续的曲面参数区间,再做自适应积分;原始模型和 +拓扑保持不变。参考导出沿用 manifest 声明的参数曲线与精度选项,布尔对账 +采用输入已有的内核容差,报告保留这些设置。 + +阈值为体积、面积和包围盒相对误差 `1e-3`,另有绝对误差保护;STEP 双向 +差集体积相对误差 `1e-3`。源执行失败、缺指标、未知操作、翻译不完整和空实体 +都不会判为通过。验收通过是给定输入在这些阈值下的结果。`metrics_quality` +单独报告基础几何检查;要求 STEP 对账时,任何参考计算失败仍会使 +`quality` 为拒绝,且 CLI 返回非零。工作区实测结果见 [BENCHMARK.md](BENCHMARK.md)。 + +模型 28 的重合球面在 OCP 7.9 中出现错误的空交集;相同几何在 OCP 8 的 +严格双向差集为零。因此上述工作区命令使用独立的 OCP 8 参考环境。 + +## 转换结构和覆盖 + +`b3ftc/tracer.py` 在真实底层实体构造、布尔、修改和变换边界捕获操作图。 +所有已执行的草图对象与查询仍由 build123d 计算,在实体特征的输入处转录 +实际轮廓。JSON 保存参数、世界坐标、精确曲线控制数据和拓扑指纹,不保存 +最终实体 BRep。`profiles.py`、`emit.py`、`replay.py` 分别负责轮廓、格式和 +实体数据流;外部验收位于 `validation.py` 及独立 worker。 + +当前支持盒、圆柱、圆锥、球、完整圆环及部分原语;拉伸、带拔模角拉伸、 +限界拉伸、扭转拉伸、旋转、放样、单/多截面扫掠;布尔、圆角、倒角、拔模、 +双向实体偏移与抽壳、平面分割、刚体与一般仿射变换、多实体组合。 +草图支持直线、圆弧、圆、椭圆、精确有理 B 样条与闭合/周期样条;曲线型 +文字及三维路径使用实际曲线控制数据。多实体输出为完整 `@scad.assemble`。 + +生成代码使用现行 FTC 块头、几何档标注、keyword 实参、QL 谓词和基数。 +数字来源于实际调用,不虚构参数名。动态追踪只描述执行到的路径;输出不会 +保留未执行的分支,也不承诺恢复源草图的约束或全部表达式。 + +**API 清单不等于全部 API 转换已通过验证。** `api_coverage.json` 和 +`API_RESEARCH.md` 梳理了 203 个顶层导出、540 个去重公开成员和 138 个类。 +查询、布局和多数草图 API 通过实际求值再转录轮廓覆盖;非平面曲面构造、 +原生内核直接包装等未接入的实体构造、部分圆环截面、特殊扫掠模式、复杂孔 +拓扑变化等仍有明确边界。未知节点会阻断依赖它的后续特征,并写入 meta, +不会导入最终模型作为替代。完整清单可重生: + +```bash +../.venv/bin/python tools/research/build123dftc/research/inspect_api.py --help +``` + +## 回归测试 + +`test/build123d_traces` 保留真实捕获的轮廓、修改、镜像、文字和螺旋扫掠 +fixture,并带出处。普通 FTC 测试不依赖 build123d;执行捕获测试在其专用 +环境运行。 + +```bash +../.venv/bin/python -m pytest test/test_build123d_trace.py test/test_build123d_unknown_api.py -q +../.venv-sca/bin/python -m pytest \ + test/test_build123d_cli.py test/test_build123d_translation_output.py \ + test/test_build123d_validation.py test/test_deformation_features.py \ + test/test_section_features.py test/test_limited_extrusion.py \ + test/test_rational_volume_precision.py test/test_sketch_closed_bspline.py -q +``` diff --git a/tools/research/build123dftc/api_coverage.json b/tools/research/build123dftc/api_coverage.json new file mode 100644 index 00000000..15ecbe82 --- /dev/null +++ b/tools/research/build123dftc/api_coverage.json @@ -0,0 +1,19803 @@ +{ + "schema_version": 1, + "purpose": "Version-specific API inventory and static source corpus evidence; unverified is not implemented support.", + "build123d_version": "0.13.0", + "corpus_tag": "v0.13.0", + "corpus_commit": "38effd343e1508964673faf59300a5cc68fbedc1", + "sources": [ + "https://build123d.readthedocs.io/en/v0.13.0/objects.html", + "https://build123d.readthedocs.io/en/v0.13.0/operations.html", + "https://build123d.readthedocs.io/en/v0.13.0/key_concepts_builder.html", + "https://build123d.readthedocs.io/en/v0.13.0/key_concepts_algebra.html", + "https://build123d.readthedocs.io/en/v0.13.0/direct_api_reference.html" + ], + "scope": "203 package __all__ exports plus public build123d-declared members reachable through these classes, Shape, topology mixins and Builder; Python/OCP internals are excluded.", + "counts": { + "top_level_exports": 203, + "unique_public_member_declarations": 540, + "class_interfaces": 138, + "corpus_models": 50, + "corpus_distinct_top_level_calls": 50, + "corpus_top_level_call_sites": 454, + "top_level_by_category": { + "constant_or_type_alias": 15, + "enum": 32, + "locations": 4, + "builder": 3, + "object_curve": 27, + "drawing_object": 6, + "object_sketch": 15, + "object_part": 11, + "geometry": 12, + "direct_topology": 20, + "assembly_joint": 5, + "utility": 15, + "export": 9, + "import": 6, + "operation": 23 + }, + "members_by_category": { + "algebra_operator": 41, + "property": 122, + "query_or_utility": 247, + "feature": 68, + "transform": 18, + "factory": 40, + "context_lifecycle": 4 + } + }, + "top_level_api": [ + { + "name": "MC", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "MM", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "CM", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "M", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "IN", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "FT", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "THOU", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "UNITS_PER_METER", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "G", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "KG", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "G_PER_LB", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "LB", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "UNITS_PER_KILOGRAM", + "kind": "value", + "category": "constant_or_type_alias", + "module": "builtins", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Align", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 55, + "signature": "(*values)", + "values": [ + "MIN", + "CENTER", + "MAX", + "NONE" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ApproxOption", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 72, + "signature": "(*values)", + "values": [ + "ARC", + "NONE", + "SPLINE" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "AngularDirection", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 83, + "signature": "(*values)", + "values": [ + "CLOCKWISE", + "COUNTER_CLOCKWISE" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "CenterOf", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 93, + "signature": "(*values)", + "values": [ + "GEOMETRY", + "MASS", + "BOUNDING_BOX" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ContinuityLevel", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 104, + "signature": "(*values)", + "values": [ + "C0", + "C1", + "C2" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Convexity", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 126, + "signature": "(*values)", + "values": [ + "CONVEX", + "CONCAVE", + "SMOOTH", + "SADDLE" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Extrinsic", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 150, + "signature": "(*values)", + "values": [ + "XYZ", + "XZY", + "YZX", + "YXZ", + "ZXY", + "ZYX", + "XYX", + "XZX", + "YZY", + "YXY", + "ZXZ", + "ZYZ" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "FontStyle", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 275, + "signature": "(*values)", + "values": [ + "REGULAR", + "BOLD", + "ITALIC", + "BOLDITALIC" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "FrameMethod", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 171, + "signature": "(*values)", + "values": [ + "FRENET", + "CORRECTED" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "GeomType", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 181, + "signature": "(*values)", + "values": [ + "PLANE", + "CYLINDER", + "CONE", + "SPHERE", + "TORUS", + "BEZIER", + "BSPLINE", + "REVOLUTION", + "EXTRUSION", + "OFFSET", + "LINE", + "CIRCLE", + "ELLIPSE", + "HYPERBOLA", + "PARABOLA", + "OTHER" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "HeadType", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 205, + "signature": "(*values)", + "values": [ + "STRAIGHT", + "CURVED", + "FILLETED" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Intrinsic", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 216, + "signature": "(*values)", + "values": [ + "XYZ", + "XZY", + "YZX", + "YXZ", + "ZXY", + "ZYX", + "XYX", + "XZX", + "YZY", + "YXY", + "ZXZ", + "ZYZ" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Keep", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 237, + "signature": "(*values)", + "values": [ + "ALL", + "BOTTOM", + "BOTH", + "INSIDE", + "OUTSIDE", + "TOP" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Kind", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 251, + "signature": "(*values)", + "values": [ + "ARC", + "INTERSECTION", + "TANGENT" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Sagitta", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 287, + "signature": "(*values)", + "values": [ + "SHORT", + "LONG", + "BOTH" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "LengthMode", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 298, + "signature": "(*values)", + "values": [ + "DIAGONAL", + "HORIZONTAL", + "VERTICAL" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "MeshType", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 309, + "signature": "(*values)", + "values": [ + "OTHER", + "MODEL", + "SUPPORT", + "SOLIDSUPPORT" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Mode", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 262, + "signature": "(*values)", + "values": [ + "ADD", + "SUBTRACT", + "INTERSECT", + "REPLACE", + "PRIVATE" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "NumberDisplay", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 321, + "signature": "(*values)", + "values": [ + "DECIMAL", + "FRACTION" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "PageSize", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 331, + "signature": "(*values)", + "values": [ + "A0", + "A1", + "A2", + "A3", + "A4", + "A5", + "A6", + "A7", + "A8", + "A9", + "A10", + "LETTER", + "LEGAL", + "LEDGER" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Tangency", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 353, + "signature": "(*values)", + "values": [ + "UNQUALIFIED", + "ENCLOSING", + "ENCLOSED", + "OUTSIDE" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "PositionMode", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 365, + "signature": "(*values)", + "values": [ + "LENGTH", + "PARAMETER" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "PrecisionMode", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 375, + "signature": "(*values)", + "values": [ + "SESSION", + "GREATEST", + "AVERAGE", + "LEAST" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Select", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 394, + "signature": "(*values)", + "values": [ + "ALL", + "LAST", + "NEW" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Side", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 414, + "signature": "(*values)", + "values": [ + "LEFT", + "RIGHT", + "BOTH" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "SortBy", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 425, + "signature": "(*values)", + "values": [ + "LENGTH", + "RADIUS", + "AREA", + "VOLUME", + "DISTANCE" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "TextAlign", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 438, + "signature": "(*values)", + "values": [ + "BOTTOM", + "CENTER", + "LEFT", + "RIGHT", + "TOP", + "TOPFIRSTLINE" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Transition", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 452, + "signature": "(*values)", + "values": [ + "RIGHT", + "ROUND", + "TRANSFORMED" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Unit", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 463, + "signature": "(*values)", + "values": [ + "MC", + "MM", + "CM", + "M", + "IN", + "FT", + "G", + "KG", + "LB" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Until", + "kind": "class", + "category": "enum", + "module": "build123d.build_enums", + "conversion_status": "unverified", + "source_file": "build123d/build_enums.py", + "source_line": 480, + "signature": "(*values)", + "values": [ + "NEXT", + "LAST", + "PREVIOUS", + "FIRST" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "HexLocations", + "kind": "class", + "category": "locations", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 989, + "signature": "(radius: 'float', x_count: 'int', y_count: 'int', major_radius: 'bool' = False, align: 'Align | tuple[Align, Align]' = (, ))", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "PolarLocations", + "kind": "class", + "category": "locations", + "module": "build123d.build_common", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/build_common.py", + "source_line": 1093, + "signature": "(radius: 'float', count: 'int', start_angle: 'float' = 0.0, angular_range: 'float' = 360.0, rotate: 'bool' = True, endpoint: 'bool' = False)", + "validation_evidence": { + "accepted_models": [ + "13_countersink_counterbore", + "31_nested_location_pattern", + "32_variable_height_pattern", + "33_function_generated_pattern" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Locations", + "kind": "class", + "category": "locations", + "module": "build123d.build_common", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/build_common.py", + "source_line": 1148, + "signature": "(*pts: 'VectorLike | Vertex | Location | Face | Plane | Axis | Iterable[VectorLike | Vertex | Location | Face | Plane | Axis]')", + "validation_evidence": { + "accepted_models": [ + "05_offset_cutouts", + "06_point_list_holes", + "07_polygon_holes", + "13_countersink_counterbore", + "19_vertex_cutouts", + "23_revolved_profile", + "28_face_located_sphere_holes", + "33_function_generated_pattern", + "36_extrude_until", + "38_rotated_boxes", + "41_pillow_block", + "43_lego", + "45_key_cap", + "48_circuit_board", + "49_holes" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "GridLocations", + "kind": "class", + "category": "locations", + "module": "build123d.build_common", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/build_common.py", + "source_line": 1220, + "signature": "(x_spacing: 'float', y_spacing: 'float', x_count: 'int', y_count: 'int', align: 'Align | tuple[Align, Align]' = (, ))", + "validation_evidence": { + "accepted_models": [ + "11_grid_polygon_holes", + "16_mirrored_3d_parts", + "22_angled_drill_holes", + "31_nested_location_pattern", + "41_pillow_block", + "42_din_rail", + "43_lego", + "48_circuit_board" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BuildLine", + "kind": "class", + "category": "builder", + "module": "build123d.build_line", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/build_line.py", + "source_line": 39, + "signature": "(placement: 'Face | Plane | Location' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)), mode: 'Mode' = )", + "validation_evidence": { + "accepted_models": [ + "04_lines_and_arcs_profile", + "08_i_beam", + "12_spline_profile", + "14_swept_square_tube", + "15_mirrored_profile", + "23_revolved_profile", + "29_occ_bottle", + "30_bezier_profile", + "35_curved_slots", + "39_pegboard_j_hook", + "40_handle", + "47_vase" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BuildPart", + "kind": "class", + "category": "builder", + "module": "build123d.build_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/build_part.py", + "source_line": 42, + "signature": "(*placements: 'Face | Plane | Location', mode: 'Mode' = )", + "validation_evidence": { + "accepted_models": [ + "01_rectangular_plate", + "02_plate_with_hole", + "03_prismatic_solid", + "04_lines_and_arcs_profile", + "05_offset_cutouts", + "06_point_list_holes", + "07_polygon_holes", + "08_i_beam", + "09_fillets_and_chamfers", + "10_filleted_hole", + "11_grid_polygon_holes", + "12_spline_profile", + "13_countersink_counterbore", + "14_swept_square_tube", + "15_mirrored_profile", + "16_mirrored_3d_parts", + "17_face_mirror", + "18_face_cutout", + "19_vertex_cutouts", + "20_offset_plane_cylinder", + "21_crossed_cylinders", + "22_angled_drill_holes", + "23_revolved_profile", + "24_circle_rectangle_loft", + "25_offset_polygon_layers", + "26_thin_wall_box", + "27_split_plate", + "28_face_located_sphere_holes", + "29_occ_bottle", + "30_bezier_profile", + "31_nested_location_pattern", + "32_variable_height_pattern", + "33_function_generated_pattern", + "34_embossed_debossed_text", + "35_curved_slots", + "36_extrude_until", + "37_positioned_sketches", + "38_rotated_boxes", + "39_pegboard_j_hook", + "40_handle", + "41_pillow_block", + "42_din_rail", + "43_lego", + "44_loft", + "45_key_cap", + "47_vase", + "48_circuit_board", + "49_holes" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BuildSketch", + "kind": "class", + "category": "builder", + "module": "build123d.build_sketch", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/build_sketch.py", + "source_line": 39, + "signature": "(*placements: 'Face | Plane | Location', mode: 'Mode' = )", + "validation_evidence": { + "accepted_models": [ + "03_prismatic_solid", + "04_lines_and_arcs_profile", + "05_offset_cutouts", + "06_point_list_holes", + "07_polygon_holes", + "08_i_beam", + "11_grid_polygon_holes", + "12_spline_profile", + "14_swept_square_tube", + "15_mirrored_profile", + "16_mirrored_3d_parts", + "17_face_mirror", + "18_face_cutout", + "19_vertex_cutouts", + "20_offset_plane_cylinder", + "21_crossed_cylinders", + "22_angled_drill_holes", + "23_revolved_profile", + "24_circle_rectangle_loft", + "25_offset_polygon_layers", + "27_split_plate", + "28_face_located_sphere_holes", + "29_occ_bottle", + "30_bezier_profile", + "31_nested_location_pattern", + "32_variable_height_pattern", + "33_function_generated_pattern", + "34_embossed_debossed_text", + "35_curved_slots", + "36_extrude_until", + "37_positioned_sketches", + "39_pegboard_j_hook", + "40_handle", + "41_pillow_block", + "42_din_rail", + "43_lego", + "44_loft", + "45_key_cap", + "47_vase", + "48_circuit_board" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BaseCurveObject", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 75, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BaseEdgeObject", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 105, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BaseLineObject", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 90, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Airfoil", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 119, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Bezier", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_curve.py", + "source_line": 240, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "30_bezier_profile" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BlendCurve", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 269, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BSpline", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 432, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "CenterArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 491, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ConstrainedArcs", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 563, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ConstrainedLines", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 819, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "DoubleTangentArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 971, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "EllipticalCenterArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 1070, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "EllipticalStartArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 1149, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ParabolicCenterArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 1257, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "HyperbolicCenterArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 1335, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "FilletPolyline", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 1458, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Helix", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_curve.py", + "source_line": 1416, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "50_spring" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "IntersectingLine", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 1760, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Line", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_curve.py", + "source_line": 1731, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "04_lines_and_arcs_profile", + "12_spline_profile", + "14_swept_square_tube", + "15_mirrored_profile", + "23_revolved_profile", + "29_occ_bottle", + "39_pegboard_j_hook", + "47_vase" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "PolarLine", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_curve.py", + "source_line": 1799, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "39_pegboard_j_hook" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Polyline", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_curve.py", + "source_line": 1894, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "08_i_beam", + "23_revolved_profile", + "30_bezier_profile", + "47_vase" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "RadiusArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_curve.py", + "source_line": 1933, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "35_curved_slots", + "47_vase" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "SagittaArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 1985, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Spline", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_curve.py", + "source_line": 2023, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "12_spline_profile", + "40_handle", + "47_vase" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "TangentArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 2080, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "JernArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_curve.py", + "source_line": 1631, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "14_swept_square_tube", + "39_pegboard_j_hook" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ThreePointArc", + "kind": "class", + "category": "object_curve", + "module": "build123d.objects_curve", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_curve.py", + "source_line": 2120, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "04_lines_and_arcs_profile", + "29_occ_bottle" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ArrowHead", + "kind": "class", + "category": "drawing_object", + "module": "build123d.drafting", + "conversion_status": "unverified", + "source_file": "build123d/drafting.py", + "source_line": 66, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Arrow", + "kind": "class", + "category": "drawing_object", + "module": "build123d.drafting", + "conversion_status": "unverified", + "source_file": "build123d/drafting.py", + "source_line": 108, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BaseSketchObject", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "unverified", + "source_file": "build123d/objects_sketch.py", + "source_line": 64, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Circle", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_sketch.py", + "source_line": 101, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "03_prismatic_solid", + "05_offset_cutouts", + "06_point_list_holes", + "16_mirrored_3d_parts", + "19_vertex_cutouts", + "20_offset_plane_cylinder", + "21_crossed_cylinders", + "22_angled_drill_holes", + "23_revolved_profile", + "24_circle_rectangle_loft", + "27_split_plate", + "29_occ_bottle", + "36_extrude_until", + "37_positioned_sketches", + "39_pegboard_j_hook", + "40_handle", + "43_lego", + "44_loft", + "45_key_cap", + "48_circuit_board", + "50_spring" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Draft", + "kind": "class", + "category": "drawing_object", + "module": "build123d.drafting", + "conversion_status": "unverified", + "source_file": "build123d/drafting.py", + "source_line": 163, + "signature": "(font_size: float = 5.0, font: str = 'Arial', font_style: build123d.build_enums.FontStyle = , head_type: build123d.build_enums.HeadType = , arrow_length: float = 3.0, line_width: float = 0.5, pad_around_text: float = 2.0, unit: build123d.build_enums.Unit = , number_display: build123d.build_enums.NumberDisplay = , display_units: bool = True, decimal_precision: int = 2, fractional_precision: int = 64, extension_gap: float = 2.0) -> None", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "DimensionLine", + "kind": "class", + "category": "drawing_object", + "module": "build123d.drafting", + "conversion_status": "unverified", + "source_file": "build123d/drafting.py", + "source_line": 330, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Ellipse", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_sketch.py", + "source_line": 136, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "37_positioned_sketches" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ExtensionLine", + "kind": "class", + "category": "drawing_object", + "module": "build123d.drafting", + "conversion_status": "unverified", + "source_file": "build123d/drafting.py", + "source_line": 498, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Polygon", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "unverified", + "source_file": "build123d/objects_sketch.py", + "source_line": 169, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Rectangle", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_sketch.py", + "source_line": 206, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "03_prismatic_solid", + "05_offset_cutouts", + "07_polygon_holes", + "14_swept_square_tube", + "16_mirrored_3d_parts", + "18_face_cutout", + "24_circle_rectangle_loft", + "36_extrude_until", + "37_positioned_sketches", + "40_handle", + "41_pillow_block", + "42_din_rail", + "43_lego", + "45_key_cap", + "48_circuit_board" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "RectangleRounded", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "unverified", + "source_file": "build123d/objects_sketch.py", + "source_line": 239, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "RegularPolygon", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_sketch.py", + "source_line": 278, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "07_polygon_holes", + "11_grid_polygon_holes", + "17_face_mirror", + "19_vertex_cutouts", + "25_offset_polygon_layers", + "28_face_located_sphere_holes", + "31_nested_location_pattern", + "32_variable_height_pattern", + "33_function_generated_pattern" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "SlotArc", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_sketch.py", + "source_line": 347, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "35_curved_slots" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "SlotCenterPoint", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "unverified", + "source_file": "build123d/objects_sketch.py", + "source_line": 377, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "SlotCenterToCenter", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_sketch.py", + "source_line": 426, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "35_curved_slots" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "SlotOverall", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_sketch.py", + "source_line": 470, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "42_din_rail" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Superellipse", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "unverified", + "source_file": "build123d/objects_sketch.py", + "source_line": 517, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Text", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_sketch.py", + "source_line": 581, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "34_embossed_debossed_text" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "TechnicalDrawing", + "kind": "class", + "category": "drawing_object", + "module": "build123d.drafting", + "conversion_status": "unverified", + "source_file": "build123d/drafting.py", + "source_line": 699, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Trapezoid", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "unverified", + "source_file": "build123d/objects_sketch.py", + "source_line": 688, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Triangle", + "kind": "class", + "category": "object_sketch", + "module": "build123d.objects_sketch", + "conversion_status": "unverified", + "source_file": "build123d/objects_sketch.py", + "source_line": 767, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BasePartObject", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "unverified", + "source_file": "build123d/objects_part.py", + "source_line": 58, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Box", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_part.py", + "source_line": 112, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "01_rectangular_plate", + "02_plate_with_hole", + "09_fillets_and_chamfers", + "10_filleted_hole", + "11_grid_polygon_holes", + "18_face_cutout", + "20_offset_plane_cylinder", + "22_angled_drill_holes", + "24_circle_rectangle_loft", + "26_thin_wall_box", + "27_split_plate", + "34_embossed_debossed_text", + "35_curved_slots", + "38_rotated_boxes", + "43_lego" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Cone", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "unverified", + "source_file": "build123d/objects_part.py", + "source_line": 154, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ConvexPolyhedron", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "unverified", + "source_file": "build123d/objects_part.py", + "source_line": 205, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "CounterBoreHole", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_part.py", + "source_line": 264, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "13_countersink_counterbore", + "41_pillow_block", + "49_holes" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "CounterSinkHole", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_part.py", + "source_line": 312, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "13_countersink_counterbore", + "49_holes" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Cylinder", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_part.py", + "source_line": 365, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "02_plate_with_hole", + "13_countersink_counterbore", + "43_lego", + "49_holes" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Hole", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_part.py", + "source_line": 411, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "10_filleted_hole", + "11_grid_polygon_holes", + "28_face_located_sphere_holes", + "49_holes" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Sphere", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/objects_part.py", + "source_line": 453, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "28_face_located_sphere_holes", + "45_key_cap" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Torus", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "unverified", + "source_file": "build123d/objects_part.py", + "source_line": 503, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Wedge", + "kind": "class", + "category": "object_part", + "module": "build123d.objects_part", + "conversion_status": "unverified", + "source_file": "build123d/objects_part.py", + "source_line": 557, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BoundBox", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1034, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "OrientedBoundBox", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2214, + "signature": "(shape: 'Bnd_OBB | Shape')", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Rotation", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2425, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Rot", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/geometry.py", + "source_line": 2425, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "38_rotated_boxes", + "47_vase" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Pos", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2575, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "RotationLike", + "kind": "value", + "category": "constant_or_type_alias", + "module": "types", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ShapeList", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.shape_core", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3301, + "signature": "(iterable=(), /)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "topo_distance_to", + "kind": "function", + "category": "direct_topology", + "module": "build123d.topology.shape_core", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3115, + "signature": "(other: 'Shape | Iterable[Shape]') -> 'Callable[[Shape], int | float]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Axis", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/geometry.py", + "source_line": 631, + "signature": "(*args: 'Any', **kwargs: 'Any') -> 'None'", + "validation_evidence": { + "accepted_models": [ + "19_vertex_cutouts" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Color", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1380, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Curve", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.composite", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 954, + "signature": "(obj: 'TopoDS_Compound | Iterable[Shape] | None' = None, label: 'str' = '', color: 'Color | None' = None, material: 'FinishedMaterial | None' = None, joints: 'dict[str, Joint] | None' = None, parent: 'Compound | None' = None, children: 'Sequence[Shape] | None' = None)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Vector", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/geometry.py", + "source_line": 163, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [ + "47_vase" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "VectorLike", + "kind": "value", + "category": "constant_or_type_alias", + "module": "types", + "conversion_status": "unverified", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Vertex", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.zero_d", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 89, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Edge", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.one_d", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1638, + "signature": "(obj: 'TopoDS_Edge | Axis | None | None' = None, label: 'str' = '', color: 'Color | None' = None, parent: 'Compound | None' = None)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Wire", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.one_d", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3528, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Face", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.two_d", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 804, + "signature": "(*args: 'Any', **kwargs: 'Any')", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Matrix", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2617, + "signature": "(*args, **kwargs)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Solid", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.three_d", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 720, + "signature": "(obj: 'TopoDS_Solid | Shell | None' = None, label: 'str' = '', color: 'Color | None' = None, material: 'FinishedMaterial | None' = None, joints: 'dict[str, Joint] | None' = None, parent: 'Compound | None' = None)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Shell", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.two_d", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2843, + "signature": "(obj: 'TopoDS_Shell | Face | Iterable[Face] | None' = None, label: 'str' = '', color: 'Color | None' = None, parent: 'Compound | None' = None)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Part", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.composite", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 1000, + "signature": "(obj: 'TopoDS_Compound | Iterable[Shape] | None' = None, label: 'str' = '', color: 'Color | None' = None, material: 'FinishedMaterial | None' = None, joints: 'dict[str, Joint] | None' = None, parent: 'Compound | None' = None, children: 'Sequence[Shape] | None' = None)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Plane", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/geometry.py", + "source_line": 2840, + "signature": "(*args: 'Any', **kwargs: 'Any') -> 'None'", + "validation_evidence": { + "accepted_models": [ + "17_face_mirror", + "20_offset_plane_cylinder", + "21_crossed_cylinders", + "22_angled_drill_holes", + "27_split_plate", + "37_positioned_sketches", + "39_pegboard_j_hook", + "44_loft", + "45_key_cap" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Compound", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.composite", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/composite.py", + "source_line": 123, + "signature": "(obj: 'TopoDS_Compound | Iterable[Shape] | None' = None, label: 'str' = '', color: 'Color | None' = None, material: 'FinishedMaterial | None' = None, joints: 'dict[str, Joint] | None' = None, parent: 'Compound | None' = None, children: 'Sequence[Shape] | None' = None)", + "validation_evidence": { + "accepted_models": [ + "49_holes" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Location", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/geometry.py", + "source_line": 1739, + "signature": "(*args: 'Any', **kwargs: 'Any') -> 'None'", + "validation_evidence": { + "accepted_models": [ + "38_rotated_boxes" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "GeomEncoder", + "kind": "class", + "category": "geometry", + "module": "build123d.geometry", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1677, + "signature": "(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Joint", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.shape_core", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3936, + "signature": "(label: 'str', parent: 'BuildPart | Solid | Compound')", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "RigidJoint", + "kind": "class", + "category": "assembly_joint", + "module": "build123d.joints", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 53, + "signature": "(label: 'str', to_part: 'Solid | Compound | None' = None, joint_location: 'Location | None' = None)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "RevoluteJoint", + "kind": "class", + "category": "assembly_joint", + "module": "build123d.joints", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 219, + "signature": "(label: 'str', to_part: 'Solid | Compound | None' = None, axis: 'Axis' = Axis((0, 0, 0), (0, 0, 1)), angle_reference: 'VectorLike | None' = None, angular_range: 'tuple[float, float]' = (0, 360))", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Sketch", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.composite", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 985, + "signature": "(obj: 'TopoDS_Compound | Iterable[Shape] | None' = None, label: 'str' = '', color: 'Color | None' = None, material: 'FinishedMaterial | None' = None, joints: 'dict[str, Joint] | None' = None, parent: 'Compound | None' = None, children: 'Sequence[Shape] | None' = None)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "LinearJoint", + "kind": "class", + "category": "assembly_joint", + "module": "build123d.joints", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 346, + "signature": "(label: 'str', to_part: 'Solid | Compound | None' = None, axis: 'Axis' = Axis((0, 0, 0), (0, 0, 1)), linear_range: 'tuple[float, float]' = (0, inf))", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "CylindricalJoint", + "kind": "class", + "category": "assembly_joint", + "module": "build123d.joints", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 516, + "signature": "(label: 'str', to_part: 'Solid | Compound | None' = None, axis: 'Axis' = Axis((0, 0, 0), (0, 0, 1)), angle_reference: 'VectorLike | None' = None, linear_range: 'tuple[float, float]' = (0, inf), angular_range: 'tuple[float, float]' = (0, 360))", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "BallJoint", + "kind": "class", + "category": "assembly_joint", + "module": "build123d.joints", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 671, + "signature": "(label: 'str', to_part: 'Solid | Compound | None' = None, joint_location: 'Location | None' = None, angular_range: 'tuple[tuple[float, float], tuple[float, float], tuple[float, float]]' = ((0, 360), (0, 360), (0, 360)), angle_reference: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)))", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "DraftAngleError", + "kind": "class", + "category": "direct_topology", + "module": "build123d.topology.three_d", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 1849, + "signature": "(message, face=None, problematic_shape=None)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "FontManager", + "kind": "class", + "category": "utility", + "module": "build123d.text", + "conversion_status": "unverified", + "source_file": "build123d/text.py", + "source_line": 65, + "signature": "()", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Export2D", + "kind": "class", + "category": "export", + "module": "build123d.exporters", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 271, + "signature": "()", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ExportDXF", + "kind": "class", + "category": "export", + "module": "build123d.exporters", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 455, + "signature": "(version: str = 'AC1027', unit: build123d.build_enums.Unit = , color: build123d.exporters.ColorIndex | None = None, line_weight: float | None = None, line_type: build123d.exporters.LineType | None = None)", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "ExportSVG", + "kind": "class", + "category": "export", + "module": "build123d.exporters", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 840, + "signature": "(unit: build123d.build_enums.Unit = , scale: float = 1, margin: float = 0, fit_to_stroke: bool = True, precision: int = 6, fill_color: str | tuple[str, float | int] | tuple[float | int, float | int, float | int] | tuple[float | int, float | int, float | int, float | int] | int | tuple[int, int] | build123d.geometry.Color | OCP.OCP.Quantity.Quantity_ColorRGBA | build123d.exporters.ColorIndex | ezdxf.colors.RGB | None | typing_extensions.sentinel = INHERIT_COLOR, line_color: str | tuple[str, float | int] | tuple[float | int, float | int, float | int] | tuple[float | int, float | int, float | int, float | int] | int | tuple[int, int] | build123d.geometry.Color | OCP.OCP.Quantity.Quantity_ColorRGBA | build123d.exporters.ColorIndex | ezdxf.colors.RGB | None | typing_extensions.sentinel = INHERIT_COLOR, line_weight: float = 0.09, line_type: build123d.exporters.LineType = , dot_length: build123d.exporters.DotLength | float = )", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "LineType", + "kind": "class", + "category": "enum", + "module": "build123d.exporters", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 165, + "signature": "(*values)", + "values": [ + "CONTINUOUS", + "BORDER", + "BORDER2", + "BORDERX2", + "CENTER", + "CENTER2", + "CENTERX2", + "DASHDOT", + "DASHDOT2", + "DASHDOTX2", + "DASHED", + "DASHED2", + "DASHEDX2", + "DIVIDE", + "DIVIDE2", + "DIVIDEX2", + "DOT", + "DOT2", + "DOTX2", + "HIDDEN", + "HIDDEN2", + "HIDDENX2", + "PHANTOM", + "PHANTOM2", + "PHANTOMX2", + "ISO_DASH", + "ISO_DASH_SPACE", + "ISO_LONG_DASH_DOT", + "ISO_LONG_DASH_DOUBLE_DOT", + "ISO_LONG_DASH_TRIPLE_DOT", + "ISO_DOT", + "ISO_LONG_DASH_SHORT_DASH", + "ISO_LONG_DASH_DOUBLE_SHORT_DASH", + "ISO_DASH_DOT", + "ISO_DOUBLE_DASH_DOT", + "ISO_DASH_DOUBLE_DOT", + "ISO_DOUBLE_DASH_DOUBLE_DOT", + "ISO_DASH_TRIPLE_DOT", + "ISO_DOUBLE_DASH_TRIPLE_DOT" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "DotLength", + "kind": "class", + "category": "enum", + "module": "build123d.exporters", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 225, + "signature": "(*values)", + "values": [ + "TRUE_DOT", + "INKSCAPE_COMPAT", + "QCAD_IMPERIAL" + ], + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "Mesher", + "kind": "class", + "category": "utility", + "module": "build123d.mesher", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 122, + "signature": "(unit: build123d.build_enums.Unit = )", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "detect_primitives", + "kind": "function", + "category": "utility", + "module": "build123d.brep_from_stl", + "conversion_status": "unverified", + "source_file": "build123d/brep_from_stl.py", + "source_line": 1850, + "signature": "(mesh: 'Shape') -> 'tuple[ShapeList[Face], ShapeList[Face], list[str]]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "import_brep", + "kind": "function", + "category": "import", + "module": "build123d.importers", + "conversion_status": "unverified", + "source_file": "build123d/importers.py", + "source_line": 108, + "signature": "(file_name: os.PathLike | str | bytes) -> build123d.topology.shape_core.Shape", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "import_dxf", + "kind": "function", + "category": "import", + "module": "build123d.import_dxf", + "conversion_status": "unverified", + "source_file": "build123d/import_dxf.py", + "source_line": 461, + "signature": "(dxf_file: str | os.PathLike | typing.TextIO | typing.BinaryIO) -> build123d.topology.shape_core.ShapeList", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "import_step", + "kind": "function", + "category": "import", + "module": "build123d.importers", + "conversion_status": "unverified", + "source_file": "build123d/importers.py", + "source_line": 132, + "signature": "(filename: os.PathLike | str | bytes) -> build123d.topology.composite.Compound", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "import_stl", + "kind": "function", + "category": "import", + "module": "build123d.importers", + "conversion_status": "unverified", + "source_file": "build123d/importers.py", + "source_line": 272, + "signature": "(file_name: os.PathLike | str | bytes, model_unit: build123d.build_enums.Unit = ) -> build123d.topology.two_d.Face", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "import_svg", + "kind": "function", + "category": "import", + "module": "build123d.importers", + "conversion_status": "unverified", + "source_file": "build123d/importers.py", + "source_line": 403, + "signature": "(svg_file: str | pathlib.Path | typing.TextIO, *, flip_y: bool = True, align: build123d.build_enums.Align | tuple[build123d.build_enums.Align, build123d.build_enums.Align] | None = , ignore_visibility: bool = False, label_by: Union[Literal['id', 'class', 'inkscape:label'], str] = 'id') -> build123d.topology.shape_core.ShapeList[build123d.topology.one_d.Wire | build123d.topology.two_d.Face]", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "import_svg_as_buildline_code", + "kind": "function", + "category": "import", + "module": "build123d.importers", + "conversion_status": "unverified", + "source_file": "build123d/importers.py", + "source_line": 327, + "signature": "(file_name: os.PathLike | str | bytes, precision: int = 6) -> tuple[str, str]", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "delta", + "kind": "function", + "category": "direct_topology", + "module": "build123d.topology.utils", + "conversion_status": "unverified", + "source_file": "build123d/topology/utils.py", + "source_line": 260, + "signature": "(shapes_one: 'Iterable[Shape]', shapes_two: 'Iterable[Shape]') -> 'list[Shape]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "edges_to_wires", + "kind": "function", + "category": "direct_topology", + "module": "build123d.topology.one_d", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4731, + "signature": "(edges: 'Iterable[Edge]', tol: 'float' = 1e-06) -> 'ShapeList[Wire]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "new_edges", + "kind": "function", + "category": "direct_topology", + "module": "build123d.topology.utils", + "conversion_status": "unverified", + "source_file": "build123d/topology/utils.py", + "source_line": 301, + "signature": "(*objects: 'Shape', combined: 'Shape') -> 'ShapeList[Edge]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "pack", + "kind": "function", + "category": "utility", + "module": "build123d.pack", + "conversion_status": "unverified", + "source_file": "build123d/pack.py", + "source_line": 40, + "signature": "(objects: 'Collection[Shape]', padding: 'float', align_z: 'bool' = False) -> 'Collection[Shape]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "polar", + "kind": "function", + "category": "direct_topology", + "module": "build123d.topology.utils", + "conversion_status": "unverified", + "source_file": "build123d/topology/utils.py", + "source_line": 343, + "signature": "(length: 'float', angle: 'float') -> 'tuple[float, float]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "available_fonts", + "kind": "function", + "category": "utility", + "module": "build123d.text", + "conversion_status": "unverified", + "source_file": "build123d/text.py", + "source_line": 307, + "signature": "() -> list[build123d.text.FontInfo]", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "solids", + "kind": "function", + "category": "utility", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 754, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Solid]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "faces", + "kind": "function", + "category": "utility", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 720, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Face]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "wires", + "kind": "function", + "category": "utility", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 686, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Wire]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "edges", + "kind": "function", + "category": "utility", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 652, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Edge]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "vertices", + "kind": "function", + "category": "utility", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 615, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Vertex]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "solid", + "kind": "function", + "category": "utility", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 771, + "signature": "(self, select: 'Select' = ) -> 'Solid'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "face", + "kind": "function", + "category": "utility", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 737, + "signature": "(self, select: 'Select' = ) -> 'Face'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "wire", + "kind": "function", + "category": "utility", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 703, + "signature": "(self, select: 'Select' = ) -> 'Wire'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "edge", + "kind": "function", + "category": "utility", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 669, + "signature": "(self, select: 'Select' = ) -> 'Edge'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "vertex", + "kind": "function", + "category": "utility", + "module": "build123d.build_common", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 635, + "signature": "(self, select: 'Select' = ) -> 'Vertex'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "add", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "unverified", + "source_file": "typing_extensions.py", + "source_line": 204, + "signature": "(objects: build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | build123d.topology.two_d.Face | build123d.topology.three_d.Solid | build123d.topology.composite.Compound | build123d.build_common.Builder | collections.abc.Iterable[build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | build123d.topology.two_d.Face | build123d.topology.three_d.Solid | build123d.topology.composite.Compound | build123d.build_common.Builder], rotation: float | build123d.geometry.Rotation | tuple[float, float, float] | None = None, clean: bool = True, mode: build123d.build_enums.Mode = ) -> build123d.topology.composite.Compound", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "insert", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_generic.py", + "source_line": 79, + "signature": "(objects: build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | build123d.topology.two_d.Face | build123d.topology.three_d.Solid | build123d.topology.composite.Compound | build123d.build_common.Builder | collections.abc.Iterable[build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | build123d.topology.two_d.Face | build123d.topology.three_d.Solid | build123d.topology.composite.Compound | build123d.build_common.Builder], rotation: float | build123d.geometry.Rotation | tuple[float, float, float] | None = None, clean: bool = True, mode: build123d.build_enums.Mode = ) -> build123d.topology.composite.Compound", + "validation_evidence": { + "accepted_models": [ + "16_mirrored_3d_parts", + "32_variable_height_pattern", + "33_function_generated_pattern", + "38_rotated_boxes" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "bounding_box", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "unverified", + "source_file": "build123d/operations_generic.py", + "source_line": 219, + "signature": "(objects: build123d.topology.shape_core.Shape | collections.abc.Iterable[build123d.topology.shape_core.Shape] | None = None, mode: build123d.build_enums.Mode = ) -> build123d.topology.composite.Sketch | build123d.topology.composite.Part", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "chamfer", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_generic.py", + "source_line": 282, + "signature": "(objects: build123d.topology.one_d.Edge | build123d.topology.zero_d.Vertex | collections.abc.Iterable[build123d.topology.one_d.Edge | build123d.topology.zero_d.Vertex], length: float, length2: float | None = None, angle: float | None = None, reference: build123d.topology.one_d.Edge | build123d.topology.two_d.Face | None = None) -> build123d.topology.composite.Sketch | build123d.topology.composite.Part", + "validation_evidence": { + "accepted_models": [ + "09_fillets_and_chamfers", + "11_grid_polygon_holes", + "18_face_cutout" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "draft", + "kind": "function", + "category": "operation", + "module": "build123d.operations_part", + "conversion_status": "unverified", + "source_file": "build123d/operations_part.py", + "source_line": 60, + "signature": "(faces: 'Face | Iterable[Face]', neutral_plane: 'Plane', angle: 'float') -> 'Part'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "extrude", + "kind": "function", + "category": "operation", + "module": "build123d.operations_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_part.py", + "source_line": 113, + "signature": "(to_extrude: 'Face | Sketch | None' = None, amount: 'float | None' = None, dir: 'VectorLike | None' = None, until: 'Until | None' = None, target: 'Compound | Solid | None' = None, both: 'bool' = False, taper: 'float' = 0.0, clean: 'bool' = True, mode: 'Mode' = ) -> 'Part'", + "validation_evidence": { + "accepted_models": [ + "03_prismatic_solid", + "04_lines_and_arcs_profile", + "05_offset_cutouts", + "06_point_list_holes", + "07_polygon_holes", + "08_i_beam", + "11_grid_polygon_holes", + "12_spline_profile", + "15_mirrored_profile", + "16_mirrored_3d_parts", + "17_face_mirror", + "18_face_cutout", + "19_vertex_cutouts", + "20_offset_plane_cylinder", + "21_crossed_cylinders", + "22_angled_drill_holes", + "25_offset_polygon_layers", + "27_split_plate", + "28_face_located_sphere_holes", + "29_occ_bottle", + "30_bezier_profile", + "31_nested_location_pattern", + "32_variable_height_pattern", + "33_function_generated_pattern", + "34_embossed_debossed_text", + "35_curved_slots", + "36_extrude_until", + "37_positioned_sketches", + "41_pillow_block", + "42_din_rail", + "43_lego", + "45_key_cap", + "48_circuit_board" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "fillet", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_generic.py", + "source_line": 406, + "signature": "(objects: build123d.topology.one_d.Edge | build123d.topology.zero_d.Vertex | collections.abc.Iterable[build123d.topology.one_d.Edge | build123d.topology.zero_d.Vertex], radius: float) -> build123d.topology.composite.Sketch | build123d.topology.composite.Part | build123d.topology.composite.Curve", + "validation_evidence": { + "accepted_models": [ + "09_fillets_and_chamfers", + "10_filleted_hole", + "11_grid_polygon_holes", + "16_mirrored_3d_parts", + "18_face_cutout", + "29_occ_bottle", + "40_handle", + "41_pillow_block", + "42_din_rail", + "45_key_cap", + "47_vase" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "full_round", + "kind": "function", + "category": "operation", + "module": "build123d.operations_sketch", + "conversion_status": "unverified", + "source_file": "build123d/operations_sketch.py", + "source_line": 53, + "signature": "(edge: 'Edge', invert: 'bool' = False, voronoi_point_count: 'int' = 100, mode: 'Mode' = ) -> 'Sketch'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "loft", + "kind": "function", + "category": "operation", + "module": "build123d.operations_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_part.py", + "source_line": 245, + "signature": "(sections: 'Face | Sketch | Iterable[Vertex | Face | Sketch] | None' = None, ruled: 'bool' = False, clean: 'bool' = True, mode: 'Mode' = ) -> 'Part'", + "validation_evidence": { + "accepted_models": [ + "24_circle_rectangle_loft", + "44_loft" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "make_brake_formed", + "kind": "function", + "category": "operation", + "module": "build123d.operations_part", + "conversion_status": "unverified", + "source_file": "build123d/operations_part.py", + "source_line": 371, + "signature": "(thickness: 'float', station_widths: 'float | Iterable[float]', line: 'Edge | Wire | Curve | None' = None, side: 'Side' = , kind: 'Kind' = , clean: 'bool' = True, mode: 'Mode' = ) -> 'Part'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "make_face", + "kind": "function", + "category": "operation", + "module": "build123d.operations_sketch", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_sketch.py", + "source_line": 198, + "signature": "(edges: 'Edge | Wire | Curve | Iterable[Edge | Wire | Curve] | None' = None, mode: 'Mode' = ) -> 'Sketch'", + "validation_evidence": { + "accepted_models": [ + "04_lines_and_arcs_profile", + "08_i_beam", + "12_spline_profile", + "15_mirrored_profile", + "23_revolved_profile", + "29_occ_bottle", + "30_bezier_profile", + "47_vase" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "make_hull", + "kind": "function", + "category": "operation", + "module": "build123d.operations_sketch", + "conversion_status": "unverified", + "source_file": "build123d/operations_sketch.py", + "source_line": 238, + "signature": "(edges: 'Edge | Iterable[Edge] | None' = None, mode: 'Mode' = ) -> 'Sketch'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "mirror", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_generic.py", + "source_line": 512, + "signature": "(objects: build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | build123d.topology.two_d.Face | build123d.topology.composite.Compound | build123d.topology.composite.Curve | build123d.topology.composite.Sketch | build123d.topology.composite.Part | collections.abc.Iterable[build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | build123d.topology.two_d.Face | build123d.topology.composite.Compound | build123d.topology.composite.Curve | build123d.topology.composite.Sketch | build123d.topology.composite.Part] | None = None, about: build123d.geometry.Plane = Plane((0, 0, 0), (1, 0, 0), (0, -1, 0)), mode: build123d.build_enums.Mode = ) -> build123d.topology.composite.Curve | build123d.topology.composite.Sketch | build123d.topology.composite.Part | build123d.topology.composite.Compound", + "validation_evidence": { + "accepted_models": [ + "08_i_beam", + "15_mirrored_profile", + "16_mirrored_3d_parts", + "17_face_mirror", + "29_occ_bottle" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "offset", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_generic.py", + "source_line": 565, + "signature": "(objects: build123d.topology.one_d.Edge | build123d.topology.two_d.Face | build123d.topology.three_d.Solid | build123d.topology.composite.Compound | collections.abc.Iterable[build123d.topology.one_d.Edge | build123d.topology.two_d.Face | build123d.topology.three_d.Solid | build123d.topology.composite.Compound] | None = None, amount: float = 0, openings: build123d.topology.two_d.Face | list[build123d.topology.two_d.Face] | None = None, kind: build123d.build_enums.Kind = , side: build123d.build_enums.Side = , closed: bool = True, min_edge_length: float | None = None, mode: build123d.build_enums.Mode = ) -> build123d.topology.composite.Curve | build123d.topology.composite.Sketch | build123d.topology.composite.Part | build123d.topology.composite.Compound", + "validation_evidence": { + "accepted_models": [ + "25_offset_polygon_layers", + "26_thin_wall_box", + "29_occ_bottle", + "43_lego", + "44_loft", + "47_vase" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "project", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "unverified", + "source_file": "build123d/operations_generic.py", + "source_line": 720, + "signature": "(objects: build123d.topology.one_d.Edge | build123d.topology.two_d.Face | build123d.topology.one_d.Wire | build123d.geometry.Vector | build123d.topology.zero_d.Vertex | collections.abc.Iterable[build123d.topology.one_d.Edge | build123d.topology.two_d.Face | build123d.topology.one_d.Wire | build123d.geometry.Vector | build123d.topology.zero_d.Vertex] | None = None, workplane: build123d.geometry.Plane | None = None, target: build123d.topology.three_d.Solid | build123d.topology.composite.Compound | build123d.topology.composite.Part | None = None, mode: build123d.build_enums.Mode = ) -> build123d.topology.composite.Curve | build123d.topology.composite.Sketch | build123d.topology.composite.Compound | build123d.topology.shape_core.ShapeList[build123d.geometry.Vector]", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "project_workplane", + "kind": "function", + "category": "operation", + "module": "build123d.operations_part", + "conversion_status": "unverified", + "source_file": "build123d/operations_part.py", + "source_line": 481, + "signature": "(origin: 'VectorLike | Vertex', x_dir: 'VectorLike | Vertex', projection_dir: 'VectorLike', distance: 'float') -> 'Plane'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "revolve", + "kind": "function", + "category": "operation", + "module": "build123d.operations_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_part.py", + "source_line": 536, + "signature": "(profiles: 'Face | Iterable[Face] | None' = None, axis: 'Axis' = Axis((0, 0, 0), (0, 0, 1)), revolution_arc: 'float' = 360.0, clean: 'bool' = True, mode: 'Mode' = ) -> 'Part'", + "validation_evidence": { + "accepted_models": [ + "23_revolved_profile", + "36_extrude_until", + "47_vase" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "scale", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_generic.py", + "source_line": 863, + "signature": "(objects: build123d.topology.shape_core.Shape | collections.abc.Iterable[build123d.topology.shape_core.Shape] | None = None, by: float | tuple[float, float, float] = 1, about: build123d.geometry.Vector | tuple[float, float] | tuple[float, float, float] | collections.abc.Sequence[float] | None = None, mode: build123d.build_enums.Mode = ) -> build123d.topology.composite.Curve | build123d.topology.composite.Sketch | build123d.topology.composite.Part | build123d.topology.composite.Compound", + "validation_evidence": { + "accepted_models": [ + "45_key_cap" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "section", + "kind": "function", + "category": "operation", + "module": "build123d.operations_part", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_part.py", + "source_line": 591, + "signature": "(obj: 'Part | None' = None, section_by: 'Plane | Iterable[Plane]' = Plane((0, 0, 0), (1, 0, 0), (0, -1, 0)), height: 'float' = 0.0, clean: 'bool' = True, mode: 'Mode' = ) -> 'Sketch'", + "validation_evidence": { + "accepted_models": [ + "45_key_cap" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "split", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_generic.py", + "source_line": 921, + "signature": "(objects: build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | build123d.topology.two_d.Face | build123d.topology.three_d.Solid | collections.abc.Iterable[build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | build123d.topology.two_d.Face | build123d.topology.three_d.Solid] | None = None, bisect_by: build123d.geometry.Plane | build123d.topology.two_d.Face | build123d.topology.two_d.Shell = Plane((0, 0, 0), (1, 0, 0), (0, -1, 0)), keep: build123d.build_enums.Keep = , mode: build123d.build_enums.Mode = )", + "validation_evidence": { + "accepted_models": [ + "23_revolved_profile", + "27_split_plate", + "39_pegboard_j_hook" + ], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "sweep", + "kind": "function", + "category": "operation", + "module": "build123d.operations_generic", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/operations_generic.py", + "source_line": 984, + "signature": "(sections: build123d.topology.composite.Compound | build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | build123d.topology.two_d.Face | build123d.topology.three_d.Solid | collections.abc.Iterable[build123d.topology.composite.Compound | build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | build123d.topology.two_d.Face | build123d.topology.three_d.Solid] | None = None, path: build123d.topology.composite.Curve | build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | collections.abc.Iterable[build123d.topology.one_d.Edge] | None = None, multisection: bool = False, is_frenet: bool = False, transition: build123d.build_enums.Transition = , normal: build123d.geometry.Vector | tuple[float, float] | tuple[float, float, float] | collections.abc.Sequence[float] | None = None, binormal: build123d.topology.one_d.Edge | build123d.topology.one_d.Wire | None = None, clean: bool = True, mode: build123d.build_enums.Mode = ) -> build123d.topology.composite.Part | build123d.topology.composite.Sketch", + "validation_evidence": { + "accepted_models": [ + "14_swept_square_tube", + "39_pegboard_j_hook", + "40_handle", + "50_spring" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "thicken", + "kind": "function", + "category": "operation", + "module": "build123d.operations_part", + "conversion_status": "unverified", + "source_file": "build123d/operations_part.py", + "source_line": 658, + "signature": "(to_thicken: 'Face | Sketch | None' = None, amount: 'float | None' = None, normal_override: 'VectorLike | None' = None, both: 'bool' = False, clean: 'bool' = True, mode: 'Mode' = ) -> 'Part'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "trace", + "kind": "function", + "category": "operation", + "module": "build123d.operations_sketch", + "conversion_status": "unverified", + "source_file": "build123d/operations_sketch.py", + "source_line": 276, + "signature": "(lines: 'Curve | Edge | Wire | Iterable[Curve | Edge | Wire] | None' = None, line_width: 'float' = 1, mode: 'Mode' = ) -> 'Sketch'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "topo_explore_connected_edges", + "kind": "function", + "category": "direct_topology", + "module": "build123d.topology.one_d", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4767, + "signature": "(edge: 'Edge', parent: 'Shape | None' = None, continuity: 'ContinuityLevel' = ) -> 'ShapeList[Edge]'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "topo_explore_common_vertex", + "kind": "function", + "category": "direct_topology", + "module": "build123d.topology.zero_d", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 465, + "signature": "(edge1: 'Edge | TopoDS_Edge', edge2: 'Edge | TopoDS_Edge') -> 'Vertex | None'", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "export_step", + "kind": "function", + "category": "export", + "module": "build123d.exporters3d", + "conversion_status": "unverified", + "source_file": "build123d/exporters3d.py", + "source_line": 364, + "signature": "(to_export: build123d.topology.shape_core.Shape, file_path: os.PathLike | str | bytes | _io.BytesIO | typing.BinaryIO, unit: build123d.build_enums.Unit = , write_pcurves: bool = True, precision_mode: build123d.build_enums.PrecisionMode = , *, timestamp: str | datetime.datetime | None = None) -> bool", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "export_gltf", + "kind": "function", + "category": "export", + "module": "build123d.exporters3d", + "conversion_status": "unverified", + "source_file": "build123d/exporters3d.py", + "source_line": 260, + "signature": "(to_export: build123d.topology.shape_core.Shape, file_path: os.PathLike | str | bytes, unit: build123d.build_enums.Unit = , binary: bool = False, linear_deflection: float = 0.001, angular_deflection: float = 0.1) -> bool", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "export_stl", + "kind": "function", + "category": "export", + "module": "build123d.exporters3d", + "conversion_status": "unverified", + "source_file": "build123d/exporters3d.py", + "source_line": 449, + "signature": "(to_export: build123d.topology.shape_core.Shape, file_path: os.PathLike | str | bytes, tolerance: float = 0.001, angular_tolerance: float = 0.1, ascii_format: bool = False) -> bool", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "export_brep", + "kind": "function", + "category": "export", + "module": "build123d.exporters3d", + "conversion_status": "unverified", + "source_file": "build123d/exporters3d.py", + "source_line": 238, + "signature": "(to_export: build123d.topology.shape_core.Shape, file_path: os.PathLike | str | bytes | _io.BytesIO | typing.BinaryIO) -> bool", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "export_obj", + "kind": "function", + "category": "export", + "module": "build123d.exporters3d", + "conversion_status": "unverified", + "source_file": "build123d/exporters3d.py", + "source_line": 494, + "signature": "(to_export: build123d.topology.shape_core.Shape, file_path: os.PathLike | str | bytes | _io.BytesIO | typing.BinaryIO, linear_deflection: float = 0.001, angular_deflection: float = 0.1, include_uvs: bool = True, atlas_packing: bool = True, atlas_gutter: float = 0.0) -> bool", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + }, + { + "name": "export_to_pcbway", + "kind": "function", + "category": "export", + "module": "build123d.exporters3d", + "conversion_status": "unverified", + "source_file": "build123d/exporters3d.py", + "source_line": 580, + "signature": "(to_export: build123d.topology.shape_core.Shape, unit: build123d.build_enums.Unit = , write_pcurves: bool = True, precision_mode: build123d.build_enums.PrecisionMode = ) -> str", + "validation_evidence": { + "accepted_models": [], + "rejected_or_unverified_models": [], + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified." + } + } + ], + "members": { + "build123d.topology.shape_core.Shape.__add__": { + "name": "__add__", + "owner": "build123d.topology.shape_core.Shape", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1100, + "signature": "(self, other)" + }, + "build123d.topology.shape_core.Shape.__and__": { + "name": "__and__", + "owner": "build123d.topology.shape_core.Shape", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1135, + "signature": "(self, other: 'Shape | Iterable[Shape]') -> 'None | Self | Compound'" + }, + "build123d.topology.shape_core.Shape.__rmul__": { + "name": "__rmul__", + "owner": "build123d.topology.shape_core.Shape", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1221, + "signature": "(self, other: 'Plane | Location | Iterable[Plane | Location]')" + }, + "build123d.topology.shape_core.Shape.__sub__": { + "name": "__sub__", + "owner": "build123d.topology.shape_core.Shape", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1229, + "signature": "(self, other)" + }, + "build123d.topology.shape_core.Shape.area": { + "name": "area", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 391, + "signature": "(self) -> 'float'" + }, + "build123d.topology.shape_core.Shape.as_shape": { + "name": "as_shape", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 783, + "signature": "(cls, obj: 'Shape | Vector | Location | Axis | Plane') -> 'Shape'" + }, + "build123d.topology.shape_core.Shape.bounding_box": { + "name": "bounding_box", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1327, + "signature": "(self, tolerance: 'float | None' = None, optimal: 'bool' = True) -> 'BoundBox'" + }, + "build123d.topology.shape_core.Shape.cast": { + "name": "cast", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 801, + "signature": "(cls, obj: 'TopoDS_Shape') -> 'Shape'" + }, + "build123d.topology.shape_core.Shape.clean": { + "name": "clean", + "owner": "build123d.topology.shape_core.Shape", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1346, + "signature": "(self) -> 'Self'" + }, + "build123d.topology.shape_core.Shape.closest_points": { + "name": "closest_points", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1374, + "signature": "(self, other: 'Shape | VectorLike') -> 'tuple[Vector, Vector]'" + }, + "build123d.topology.shape_core.Shape.color": { + "name": "color", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 401, + "signature": "(self) -> 'None | Color'" + }, + "build123d.topology.shape_core.Shape.combined_center": { + "name": "combined_center", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "staticmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 909, + "signature": "(objects: 'Iterable[Shape]', center_of: 'CenterOf' = ) -> 'Vector'" + }, + "build123d.topology.shape_core.Shape.compound": { + "name": "compound", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1378, + "signature": "(self) -> 'Compound'" + }, + "build123d.topology.shape_core.Shape.compounds": { + "name": "compounds", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1382, + "signature": "(self) -> 'ShapeList[Compound]'" + }, + "build123d.topology.shape_core.Shape.compute_mass": { + "name": "compute_mass", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1288, + "signature": "(self, mass_unit: 'Unit' = , length_unit: 'Unit' = ) -> 'float'" + }, + "build123d.topology.shape_core.Shape.compute_volume": { + "name": "compute_volume", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1269, + "signature": "(self) -> 'float'" + }, + "build123d.topology.shape_core.Shape.convexity": { + "name": "convexity", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 469, + "signature": "(self) -> 'Convexity'" + }, + "build123d.topology.shape_core.Shape.copy_attributes_to": { + "name": "copy_attributes_to", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1386, + "signature": "(self, target: 'Shape', exceptions: 'Iterable[str] | None' = None)" + }, + "build123d.topology.shape_core.Shape.cut": { + "name": "cut", + "owner": "build123d.topology.shape_core.Shape", + "category": "feature", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1418, + "signature": "(self, *to_cut: 'Shape') -> 'Self | Compound'", + "validation_evidence": { + "accepted_models": [ + "02_plate_with_hole", + "10_filleted_hole", + "11_grid_polygon_holes", + "13_countersink_counterbore", + "18_face_cutout", + "19_vertex_cutouts", + "22_angled_drill_holes", + "27_split_plate", + "28_face_located_sphere_holes", + "34_embossed_debossed_text", + "35_curved_slots", + "41_pillow_block", + "42_din_rail", + "45_key_cap", + "49_holes" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.shape_core.Shape.distance": { + "name": "distance", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1432, + "signature": "(self, other: 'Shape') -> 'float'" + }, + "build123d.topology.shape_core.Shape.distance_to": { + "name": "distance_to", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1446, + "signature": "(self, other: 'Shape | VectorLike') -> 'float'" + }, + "build123d.topology.shape_core.Shape.distance_to_with_closest_points": { + "name": "distance_to_with_closest_points", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1450, + "signature": "(self, other: 'Shape | VectorLike') -> 'tuple[float, Vector, Vector]'" + }, + "build123d.topology.shape_core.Shape.distances": { + "name": "distances", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1475, + "signature": "(self, *others: 'Shape') -> 'Iterator[float]'" + }, + "build123d.topology.shape_core.Shape.edge": { + "name": "edge", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1498, + "signature": "(self) -> 'Edge'" + }, + "build123d.topology.shape_core.Shape.edges": { + "name": "edges", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1502, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Edge]'" + }, + "build123d.topology.shape_core.Shape.entities": { + "name": "entities", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1538, + "signature": "(self, topo_type: 'Shapes') -> 'list[TopoDS_Shape]'" + }, + "build123d.topology.shape_core.Shape.extrude": { + "name": "extrude", + "owner": "build123d.topology.shape_core.Shape", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 812, + "signature": "(cls, obj: 'Shape', direction: 'VectorLike') -> 'Edge | Face | Shell | Solid | Compound'" + }, + "build123d.topology.shape_core.Shape.face": { + "name": "face", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1544, + "signature": "(self) -> 'Face'" + }, + "build123d.topology.shape_core.Shape.faces": { + "name": "faces", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1548, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Face]'" + }, + "build123d.topology.shape_core.Shape.faces_intersected_by_axis": { + "name": "faces_intersected_by_axis", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1552, + "signature": "(self, axis: 'Axis', tol: 'float' = 0.0001) -> 'ShapeList[Face]'" + }, + "build123d.topology.shape_core.Shape.fix": { + "name": "fix", + "owner": "build123d.topology.shape_core.Shape", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1596, + "signature": "(self) -> 'Self'" + }, + "build123d.topology.shape_core.Shape.fuse": { + "name": "fuse", + "owner": "build123d.topology.shape_core.Shape", + "category": "feature", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1608, + "signature": "(self, *to_fuse: 'Shape', glue: 'bool' = False, tol: 'float | None' = None) -> 'Self | Compound'", + "validation_evidence": { + "accepted_models": [ + "13_countersink_counterbore", + "16_mirrored_3d_parts", + "17_face_mirror", + "20_offset_plane_cylinder", + "21_crossed_cylinders", + "22_angled_drill_holes", + "24_circle_rectangle_loft", + "25_offset_polygon_layers", + "29_occ_bottle", + "31_nested_location_pattern", + "32_variable_height_pattern", + "33_function_generated_pattern", + "34_embossed_debossed_text", + "36_extrude_until", + "37_positioned_sketches", + "38_rotated_boxes", + "39_pegboard_j_hook", + "41_pillow_block", + "42_din_rail", + "43_lego", + "45_key_cap", + "49_holes" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.shape_core.Shape.geom_type": { + "name": "geom_type", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 486, + "signature": "(self) -> 'GeomType'" + }, + "build123d.topology.shape_core.Shape.get_shape_list": { + "name": "get_shape_list", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "staticmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 997, + "signature": "(shape: 'Shape', entity_type: \"Literal['Vertex', 'Edge', 'Wire', 'Face', 'Shell', 'Solid', 'Compound']\") -> 'ShapeList'" + }, + "build123d.topology.shape_core.Shape.get_single_shape": { + "name": "get_single_shape", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "staticmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1044, + "signature": "(shape: 'Shape', entity_type: \"Literal['Vertex', 'Edge', 'Wire', 'Face', 'Shell', 'Solid', 'Compound']\") -> 'Shape'" + }, + "build123d.topology.shape_core.Shape.get_top_level_shapes": { + "name": "get_top_level_shapes", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1659, + "signature": "(self) -> 'ShapeList[Shape]'" + }, + "build123d.topology.shape_core.Shape.global_location": { + "name": "global_location", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 590, + "signature": "(self) -> 'Location'" + }, + "build123d.topology.shape_core.Shape.intersect": { + "name": "intersect", + "owner": "build123d.topology.shape_core.Shape", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1683, + "signature": "(self, *to_intersect: 'Shape | Vector | Location | Axis | Plane', tolerance: 'float' = 1e-06, include_touched: 'bool' = False) -> 'ShapeList | None'" + }, + "build123d.topology.shape_core.Shape.is_equal": { + "name": "is_equal", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1770, + "signature": "(self, other: 'Shape') -> 'bool'" + }, + "build123d.topology.shape_core.Shape.is_manifold": { + "name": "is_manifold", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 512, + "signature": "(self) -> 'bool'" + }, + "build123d.topology.shape_core.Shape.is_null": { + "name": "is_null", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 570, + "signature": "(self) -> 'bool'" + }, + "build123d.topology.shape_core.Shape.is_same": { + "name": "is_same", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1785, + "signature": "(self, other: 'Shape') -> 'bool'" + }, + "build123d.topology.shape_core.Shape.is_valid": { + "name": "is_valid", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 578, + "signature": "(self) -> 'bool'" + }, + "build123d.topology.shape_core.Shape.locate": { + "name": "locate", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1800, + "signature": "(self, loc: 'Location') -> 'Self'" + }, + "build123d.topology.shape_core.Shape.located": { + "name": "located", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1815, + "signature": "(self, loc: 'Location') -> 'Self'" + }, + "build123d.topology.shape_core.Shape.location": { + "name": "location", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 607, + "signature": "(self) -> 'Location'" + }, + "build123d.topology.shape_core.Shape.make_composite": { + "name": "make_composite", + "owner": "build123d.topology.shape_core.Shape", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1074, + "signature": "(cls, shapes: 'Iterable[Shape]', dimension: 'int | None' = None) -> 'Shape'" + }, + "build123d.topology.shape_core.Shape.material": { + "name": "material", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 425, + "signature": "(self) -> 'None | FinishedMaterial'" + }, + "build123d.topology.shape_core.Shape.matrix_of_inertia": { + "name": "matrix_of_inertia", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 620, + "signature": "(self) -> 'list[list[float]]'" + }, + "build123d.topology.shape_core.Shape.mesh": { + "name": "mesh", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1832, + "signature": "(self, tolerance: 'float', angular_tolerance: 'float' = 0.1)" + }, + "build123d.topology.shape_core.Shape.mirror": { + "name": "mirror", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1850, + "signature": "(self, mirror_plane: 'Plane | None' = None) -> 'Self'", + "validation_evidence": { + "accepted_models": [ + "16_mirrored_3d_parts", + "17_face_mirror" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.shape_core.Shape.move": { + "name": "move", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1872, + "signature": "(self, loc: 'Location') -> 'Self'", + "validation_evidence": { + "accepted_models": [ + "01_rectangular_plate", + "02_plate_with_hole", + "09_fillets_and_chamfers", + "10_filleted_hole", + "11_grid_polygon_holes", + "13_countersink_counterbore", + "18_face_cutout", + "20_offset_plane_cylinder", + "22_angled_drill_holes", + "24_circle_rectangle_loft", + "26_thin_wall_box", + "27_split_plate", + "28_face_located_sphere_holes", + "34_embossed_debossed_text", + "35_curved_slots", + "38_rotated_boxes", + "43_lego", + "45_key_cap", + "49_holes" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.shape_core.Shape.moved": { + "name": "moved", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1888, + "signature": "(self, loc: 'Location | Plane') -> 'Self'", + "validation_evidence": { + "accepted_models": [ + "13_countersink_counterbore", + "16_mirrored_3d_parts", + "28_face_located_sphere_holes", + "38_rotated_boxes", + "41_pillow_block", + "43_lego", + "45_key_cap", + "47_vase", + "49_holes" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.shape_core.Shape.orientation": { + "name": "orientation", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 664, + "signature": "(self) -> 'Vector'" + }, + "build123d.topology.shape_core.Shape.oriented_bounding_box": { + "name": "oriented_bounding_box", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1907, + "signature": "(self) -> 'OrientedBoundBox'" + }, + "build123d.topology.shape_core.Shape.position": { + "name": "position", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 679, + "signature": "(self) -> 'Vector'" + }, + "build123d.topology.shape_core.Shape.principal_properties": { + "name": "principal_properties", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 694, + "signature": "(self) -> 'list[tuple[Vector, float]]'" + }, + "build123d.topology.shape_core.Shape.project_faces": { + "name": "project_faces", + "owner": "build123d.topology.shape_core.Shape", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1917, + "signature": "(self, faces: 'list[Face] | Compound', path: 'Wire | Edge', start: 'float' = 0) -> 'ShapeList[Face]'" + }, + "build123d.topology.shape_core.Shape.radius_of_gyration": { + "name": "radius_of_gyration", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1987, + "signature": "(self, axis: 'Axis') -> 'float'" + }, + "build123d.topology.shape_core.Shape.register_composite_factory": { + "name": "register_composite_factory", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1066, + "signature": "(cls, dimension: 'int | None', factory: 'CompositeFactory') -> 'None'" + }, + "build123d.topology.shape_core.Shape.register_geometry_constructor": { + "name": "register_geometry_constructor", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 772, + "signature": "(cls, geometry_type: 'type', constructor: 'GeometryConstructor') -> 'None'" + }, + "build123d.topology.shape_core.Shape.register_shape_constructor": { + "name": "register_shape_constructor", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 760, + "signature": "(cls, shape_type: 'TopAbs_ShapeEnum', constructor: 'ShapeConstructor') -> 'None'" + }, + "build123d.topology.shape_core.Shape.rotate": { + "name": "rotate", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2021, + "signature": "(self, axis: 'Axis', angle: 'float', transform: 'bool' = False) -> 'Self'", + "validation_evidence": { + "accepted_models": [ + "38_rotated_boxes" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.shape_core.Shape.scale": { + "name": "scale", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2047, + "signature": "(self, factor: 'float | tuple[float, float, float]', about: 'VectorLike | None' = None) -> 'Self'", + "validation_evidence": { + "accepted_models": [ + "45_key_cap" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.shape_core.Shape.shape_type": { + "name": "shape_type", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 724, + "signature": "(self) -> 'Shapes'" + }, + "build123d.topology.shape_core.Shape.shell": { + "name": "shell", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2107, + "signature": "(self) -> 'Shell'" + }, + "build123d.topology.shape_core.Shape.shells": { + "name": "shells", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2111, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Shell]'" + }, + "build123d.topology.shape_core.Shape.show_topology": { + "name": "show_topology", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2115, + "signature": "(self, limit_class: \"Literal['Compound', 'Edge', 'Face', 'Shell', 'Solid', 'Vertex', 'Wire']\" = 'Vertex', show_center: 'bool | None' = None) -> 'str'" + }, + "build123d.topology.shape_core.Shape.solid": { + "name": "solid", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2165, + "signature": "(self) -> 'Solid'" + }, + "build123d.topology.shape_core.Shape.solids": { + "name": "solids", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2169, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Solid]'", + "validation_evidence": { + "accepted_models": [ + "22_angled_drill_holes", + "43_lego" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.shape_core.Shape.split": { + "name": "split", + "owner": "build123d.topology.shape_core.Shape", + "category": "feature", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2200, + "signature": "(self, tool: 'TrimmingTool', keep: 'Keep' = )", + "validation_evidence": { + "accepted_models": [ + "27_split_plate", + "39_pegboard_j_hook" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.shape_core.Shape.static_moments": { + "name": "static_moments", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 729, + "signature": "(self) -> 'tuple[float, float, float]'" + }, + "build123d.topology.shape_core.Shape.tessellate": { + "name": "tessellate", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2322, + "signature": "(self, tolerance: 'float', angular_tolerance: 'float' = 0.1) -> 'tuple[list[Vector], list[tuple[int, int, int]]]'" + }, + "build123d.topology.shape_core.Shape.tessellate_with_uvs": { + "name": "tessellate_with_uvs", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2371, + "signature": "(self, tolerance: 'float', angular_tolerance: 'float' = 0.1, atlas_packing: 'bool' = True, atlas_gutter: 'float' = 0.0) -> 'tuple[list[Vector], list[tuple[int, int, int]], list[Vector], list[tuple[float, float]]]'" + }, + "build123d.topology.shape_core.Shape.to_splines": { + "name": "to_splines", + "owner": "build123d.topology.shape_core.Shape", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2590, + "signature": "(self, degree: 'int' = 3, tolerance: 'float' = 0.001, nurbs: 'bool' = False) -> 'Self'" + }, + "build123d.topology.shape_core.Shape.topo_owner": { + "name": "topo_owner", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 359, + "signature": "(self) -> 'Shape | None'" + }, + "build123d.topology.shape_core.Shape.topo_parent": { + "name": "topo_parent", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 345, + "signature": "(self) -> 'Shape | None'" + }, + "build123d.topology.shape_core.Shape.touch": { + "name": "touch", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 1753, + "signature": "(self, other: 'Shape', tolerance: 'float' = 1e-06) -> 'ShapeList'" + }, + "build123d.topology.shape_core.Shape.transform_geometry": { + "name": "transform_geometry", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2627, + "signature": "(self, t_matrix: 'Matrix') -> 'Self'" + }, + "build123d.topology.shape_core.Shape.transform_shape": { + "name": "transform_shape", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2654, + "signature": "(self, t_matrix: 'Matrix') -> 'Self'" + }, + "build123d.topology.shape_core.Shape.transformed": { + "name": "transformed", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2677, + "signature": "(self, rotate: 'VectorLike' = (0, 0, 0), offset: 'VectorLike' = (0, 0, 0)) -> 'Self'" + }, + "build123d.topology.shape_core.Shape.translate": { + "name": "translate", + "owner": "build123d.topology.shape_core.Shape", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2706, + "signature": "(self, vector: 'VectorLike', transform: 'bool' = False) -> 'Self'" + }, + "build123d.topology.shape_core.Shape.vertex": { + "name": "vertex", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2962, + "signature": "(self) -> 'Vertex'" + }, + "build123d.topology.shape_core.Shape.vertices": { + "name": "vertices", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2966, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Vertex]'" + }, + "build123d.topology.shape_core.Shape.wire": { + "name": "wire", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2729, + "signature": "(self) -> 'Wire'" + }, + "build123d.topology.shape_core.Shape.wires": { + "name": "wires", + "owner": "build123d.topology.shape_core.Shape", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 2733, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Wire]'" + }, + "build123d.topology.shape_core.Shape.wrapped": { + "name": "wrapped", + "owner": "build123d.topology.shape_core.Shape", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 373, + "signature": "(self)" + }, + "build123d.topology.one_d.Mixin1D.__add__": { + "name": "__add__", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 682, + "signature": "(self, other: 'None | Shape | Iterable[Shape]') -> 'Edge | Wire | Curve | Self'" + }, + "build123d.topology.one_d.Mixin1D.__matmul__": { + "name": "__matmul__", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 739, + "signature": "(self, position: 'float') -> 'Vector'" + }, + "build123d.topology.one_d.Mixin1D.__mod__": { + "name": "__mod__", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 743, + "signature": "(self, position: 'float') -> 'Vector'" + }, + "build123d.topology.one_d.Mixin1D.__xor__": { + "name": "__xor__", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 747, + "signature": "(self, position: 'float') -> 'Location'" + }, + "build123d.topology.one_d.Mixin1D.center": { + "name": "center", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 751, + "signature": "(self, center_of: 'CenterOf' = ) -> 'Vector'" + }, + "build123d.topology.one_d.Mixin1D.common_plane": { + "name": "common_plane", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 775, + "signature": "(self, *lines: 'Edge | Wire | None', tolerance: 'float' = 1e-06) -> 'None | Plane'" + }, + "build123d.topology.one_d.Mixin1D.convexity": { + "name": "convexity", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 564, + "signature": "(self) -> 'Convexity'" + }, + "build123d.topology.one_d.Mixin1D.curvature_comb": { + "name": "curvature_comb", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 862, + "signature": "(self, count: 'int' = 100, max_tooth_size: 'float | None' = None) -> 'ShapeList[Edge]'" + }, + "build123d.topology.one_d.Mixin1D.derivative_at": { + "name": "derivative_at", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 945, + "signature": "(self, position: 'float | VectorLike', order: 'int' = 2, position_mode: 'PositionMode' = ) -> 'Vector'" + }, + "build123d.topology.one_d.Mixin1D.end_point": { + "name": "end_point", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 998, + "signature": "(self) -> 'Vector'" + }, + "build123d.topology.one_d.Mixin1D.extrude": { + "name": "extrude", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 654, + "signature": "(cls, obj: 'Shape', direction: 'VectorLike') -> 'Edge | Face | Shell | Solid | Compound'" + }, + "build123d.topology.one_d.Mixin1D.is_closed": { + "name": "is_closed", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 550, + "signature": "(self) -> 'bool'" + }, + "build123d.topology.one_d.Mixin1D.is_forward": { + "name": "is_forward", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 557, + "signature": "(self) -> 'bool'" + }, + "build123d.topology.one_d.Mixin1D.is_interior": { + "name": "is_interior", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 599, + "signature": "(self) -> 'bool'" + }, + "build123d.topology.one_d.Mixin1D.length": { + "name": "length", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 612, + "signature": "(self) -> 'float'" + }, + "build123d.topology.one_d.Mixin1D.location_at": { + "name": "location_at", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1072, + "signature": "(self, distance: 'float', position_mode: 'PositionMode' = , frame_method: 'FrameMethod' = , x_dir: 'VectorLike | None' = None) -> 'Location'" + }, + "build123d.topology.one_d.Mixin1D.locations": { + "name": "locations", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1171, + "signature": "(self, distances: 'Iterable[float]', position_mode: 'PositionMode' = , frame_method: 'FrameMethod' = , x_dir: 'VectorLike | None' = None) -> 'list[Location]'" + }, + "build123d.topology.one_d.Mixin1D.mass": { + "name": "mass", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 647, + "signature": "(self, mass_unit: 'Unit' = , length_unit: 'Unit' = ) -> 'float'" + }, + "build123d.topology.one_d.Mixin1D.normal": { + "name": "normal", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1200, + "signature": "(self) -> 'Vector'" + }, + "build123d.topology.one_d.Mixin1D.offset_2d": { + "name": "offset_2d", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1234, + "signature": "(self, distance: 'float', kind: 'Kind' = , side: 'Side' = , closed: 'bool' = True) -> 'Edge | Wire'" + }, + "build123d.topology.one_d.Mixin1D.perpendicular_line": { + "name": "perpendicular_line", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1331, + "signature": "(self, length: 'float', u_value: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1))) -> 'Edge'" + }, + "build123d.topology.one_d.Mixin1D.position_at": { + "name": "position_at", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1356, + "signature": "(self, position: 'float', position_mode: 'PositionMode' = ) -> 'Vector'" + }, + "build123d.topology.one_d.Mixin1D.positions": { + "name": "positions", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1384, + "signature": "(self, distances: 'Iterable[float] | None' = None, position_mode: 'PositionMode' = , deflection: 'float | None' = None) -> 'list[Vector]'" + }, + "build123d.topology.one_d.Mixin1D.project": { + "name": "project", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1432, + "signature": "(self, face: 'Face', direction: 'VectorLike', closest: 'bool' = True) -> 'Edge | Wire | ShapeList[Edge | Wire]'" + }, + "build123d.topology.one_d.Mixin1D.project_to_viewport": { + "name": "project_to_viewport", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1479, + "signature": "(self, viewport_origin: 'VectorLike', viewport_up: 'VectorLike' = (0, 0, 1), look_at: 'VectorLike | None' = None, focus: 'float | None' = None) -> 'tuple[ShapeList[Edge], ShapeList[Edge]]'" + }, + "build123d.topology.one_d.Mixin1D.radius": { + "name": "radius", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 619, + "signature": "(self) -> 'float'" + }, + "build123d.topology.one_d.Mixin1D.start_point": { + "name": "start_point", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1577, + "signature": "(self) -> 'Vector'" + }, + "build123d.topology.one_d.Mixin1D.tangent_angle_at": { + "name": "tangent_angle_at", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1587, + "signature": "(self, location_param: 'float' = 0.5, position_mode: 'PositionMode' = , plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1))) -> 'float'" + }, + "build123d.topology.one_d.Mixin1D.tangent_at": { + "name": "tangent_at", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1610, + "signature": "(self, position: 'float | VectorLike' = 0.5, position_mode: 'PositionMode' = ) -> 'Vector'" + }, + "build123d.topology.one_d.Mixin1D.volume": { + "name": "volume", + "owner": "build123d.topology.one_d.Mixin1D", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 642, + "signature": "(self) -> 'float'" + }, + "build123d.topology.two_d.Mixin2D.__neg__": { + "name": "__neg__", + "owner": "build123d.topology.two_d.Mixin2D", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 207, + "signature": "(self) -> 'Self'" + }, + "build123d.topology.two_d.Mixin2D.extrude": { + "name": "extrude", + "owner": "build123d.topology.two_d.Mixin2D", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 198, + "signature": "(cls, obj: 'Shape', direction: 'VectorLike') -> 'Edge | Face | Shell | Solid | Compound'" + }, + "build123d.topology.two_d.Mixin2D.find_intersection_points": { + "name": "find_intersection_points", + "owner": "build123d.topology.two_d.Mixin2D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 373, + "signature": "(self, other: 'Axis', tolerance: 'float' = 1e-06) -> 'list[tuple[Vector, Vector]]'" + }, + "build123d.topology.two_d.Mixin2D.location_at": { + "name": "location_at", + "owner": "build123d.topology.two_d.Mixin2D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 625, + "signature": "(self, *args: 'Any', **kwargs: 'Any') -> 'Location'" + }, + "build123d.topology.two_d.Mixin2D.offset": { + "name": "offset", + "owner": "build123d.topology.two_d.Mixin2D", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 629, + "signature": "(self, amount: 'float') -> 'Self'" + }, + "build123d.topology.two_d.Mixin2D.project_to_viewport": { + "name": "project_to_viewport", + "owner": "build123d.topology.two_d.Mixin2D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 633, + "signature": "(self, viewport_origin: 'VectorLike', viewport_up: 'VectorLike' = (0, 0, 1), look_at: 'VectorLike | None' = None, focus: 'float | None' = None) -> 'tuple[ShapeList[Edge], ShapeList[Edge]]'" + }, + "build123d.topology.two_d.Mixin2D.split_by_perimeter": { + "name": "split_by_perimeter", + "owner": "build123d.topology.two_d.Mixin2D", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 240, + "signature": "(self, perimeter: 'Edge | Wire', keep: 'Keep' = )" + }, + "build123d.topology.two_d.Mixin2D.touch": { + "name": "touch", + "owner": "build123d.topology.two_d.Mixin2D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 522, + "signature": "(self, other: 'Shape', tolerance: 'float' = 1e-06, found_faces: 'ShapeList | None' = None, found_edges: 'ShapeList | None' = None) -> 'ShapeList'" + }, + "build123d.topology.three_d.Mixin3D.center": { + "name": "center", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 195, + "signature": "(self, center_of: 'CenterOf' = ) -> 'Vector'" + }, + "build123d.topology.three_d.Mixin3D.chamfer": { + "name": "chamfer", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "feature", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 222, + "signature": "(self, length: 'float', length2: 'float | None', edge_list: 'Iterable[Edge]', face: 'Face | None' = None) -> 'Solid | Part'", + "validation_evidence": { + "accepted_models": [ + "09_fillets_and_chamfers", + "11_grid_polygon_holes", + "18_face_cutout" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Mixin3D.dprism": { + "name": "dprism", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 293, + "signature": "(self, basis: 'Face | None', bounds: 'list[Face | Wire]', depth: 'float | None' = None, taper: 'float' = 0, up_to_face: 'Face | None' = None, thru_all: 'bool' = True, additive: 'bool' = True) -> 'Solid'" + }, + "build123d.topology.three_d.Mixin3D.extrude": { + "name": "extrude", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 170, + "signature": "(cls, obj: 'Shape', direction: 'VectorLike') -> 'Edge | Face | Shell | Solid | Compound'" + }, + "build123d.topology.three_d.Mixin3D.fillet": { + "name": "fillet", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "feature", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 347, + "signature": "(self, radius: 'float', edge_list: 'Iterable[Edge]') -> 'Solid | Part'", + "validation_evidence": { + "accepted_models": [ + "09_fillets_and_chamfers", + "10_filleted_hole", + "11_grid_polygon_holes", + "18_face_cutout", + "29_occ_bottle", + "45_key_cap", + "47_vase" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Mixin3D.find_intersection_points": { + "name": "find_intersection_points", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 373, + "signature": "(self, other: 'Axis', tolerance: 'float' = 1e-06) -> 'list[tuple[Vector, Vector]]'" + }, + "build123d.topology.three_d.Mixin3D.hollow": { + "name": "hollow", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 382, + "signature": "(self, faces: 'Iterable[Face] | None', thickness: 'float', tolerance: 'float' = 0.0001, kind: 'Kind' = ) -> 'Solid'" + }, + "build123d.topology.three_d.Mixin3D.is_inside": { + "name": "is_inside", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 529, + "signature": "(self, point: 'VectorLike', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.topology.three_d.Mixin3D.max_fillet": { + "name": "max_fillet", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 548, + "signature": "(self, edge_list: 'Iterable[Edge]', tolerance=0.1, max_iterations: 'int' = 10) -> 'float'" + }, + "build123d.topology.three_d.Mixin3D.offset_3d": { + "name": "offset_3d", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "feature", + "descriptor": "method", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 626, + "signature": "(self, openings: 'Iterable[Face] | None', thickness: 'float', tolerance: 'float' = 0.0001, kind: 'Kind' = ) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "26_thin_wall_box", + "29_occ_bottle", + "44_loft", + "47_vase" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Mixin3D.project_to_viewport": { + "name": "project_to_viewport", + "owner": "build123d.topology.three_d.Mixin3D", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 692, + "signature": "(self, viewport_origin: 'VectorLike', viewport_up: 'VectorLike' = (0, 0, 1), look_at: 'VectorLike | None' = None, focus: 'float | None' = None) -> 'tuple[ShapeList[Edge], ShapeList[Edge]]'" + }, + "build123d.build_common.Builder.__add__": { + "name": "__add__", + "owner": "build123d.build_common.Builder", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 886, + "signature": "(self, _other) -> 'Self'" + }, + "build123d.build_common.Builder.__and__": { + "name": "__and__", + "owner": "build123d.build_common.Builder", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 894, + "signature": "(self, _other) -> 'Self'" + }, + "build123d.build_common.Builder.__enter__": { + "name": "__enter__", + "owner": "build123d.build_common.Builder", + "category": "context_lifecycle", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 268, + "signature": "(self) -> 'Self'" + }, + "build123d.build_common.Builder.__exit__": { + "name": "__exit__", + "owner": "build123d.build_common.Builder", + "category": "context_lifecycle", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 322, + "signature": "(self, exception_type, exception_value, traceback)" + }, + "build123d.build_common.Builder.__sub__": { + "name": "__sub__", + "owner": "build123d.build_common.Builder", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 890, + "signature": "(self, _other) -> 'Self'" + }, + "build123d.build_common.Builder.edge": { + "name": "edge", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 669, + "signature": "(self, select: 'Select' = ) -> 'Edge'" + }, + "build123d.build_common.Builder.edges": { + "name": "edges", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 652, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Edge]'" + }, + "build123d.build_common.Builder.face": { + "name": "face", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 737, + "signature": "(self, select: 'Select' = ) -> 'Face'" + }, + "build123d.build_common.Builder.faces": { + "name": "faces", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 720, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Face]'" + }, + "build123d.build_common.Builder.label": { + "name": "label", + "owner": "build123d.build_common.Builder", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 252, + "signature": "(self) -> 'str'" + }, + "build123d.build_common.Builder.lasts": { + "name": "lasts", + "owner": "build123d.build_common.Builder", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 804, + "signature": "(self) -> 'dict'" + }, + "build123d.build_common.Builder.max_dimension": { + "name": "max_dimension", + "owner": "build123d.build_common.Builder", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 247, + "signature": "(self) -> 'float'" + }, + "build123d.build_common.Builder.new_edges": { + "name": "new_edges", + "owner": "build123d.build_common.Builder", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "typing_extensions.py", + "source_line": 262, + "signature": "(self) -> 'ShapeList[Edge]'" + }, + "build123d.build_common.Builder.news": { + "name": "news", + "owner": "build123d.build_common.Builder", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 811, + "signature": "(self) -> 'dict'" + }, + "build123d.build_common.Builder.solid": { + "name": "solid", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 771, + "signature": "(self, select: 'Select' = ) -> 'Solid'" + }, + "build123d.build_common.Builder.solids": { + "name": "solids", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 754, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Solid]'" + }, + "build123d.build_common.Builder.validate_inputs": { + "name": "validate_inputs", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 837, + "signature": "(self, validating_class, objects: 'Shape | Iterable[Shape] | None' = None)" + }, + "build123d.build_common.Builder.vertex": { + "name": "vertex", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 635, + "signature": "(self, select: 'Select' = ) -> 'Vertex'" + }, + "build123d.build_common.Builder.vertices": { + "name": "vertices", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 615, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Vertex]'" + }, + "build123d.build_common.Builder.wire": { + "name": "wire", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 703, + "signature": "(self, select: 'Select' = ) -> 'Wire'" + }, + "build123d.build_common.Builder.wires": { + "name": "wires", + "owner": "build123d.build_common.Builder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 686, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Wire]'" + }, + "build123d.build_common.BaseObjectMeta.__call__": { + "name": "__call__", + "owner": "build123d.build_common.BaseObjectMeta", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 1527, + "signature": "(cls, *args, **kwargs)" + }, + "build123d.build_common.LocationList.__enter__": { + "name": "__enter__", + "owner": "build123d.build_common.LocationList", + "category": "context_lifecycle", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 939, + "signature": "(self)" + }, + "build123d.build_common.LocationList.__exit__": { + "name": "__exit__", + "owner": "build123d.build_common.LocationList", + "category": "context_lifecycle", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 966, + "signature": "(self, exception_type, exception_value, traceback)" + }, + "build123d.build_common.LocationList.locations": { + "name": "locations", + "owner": "build123d.build_common.LocationList", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_common.py", + "source_line": 930, + "signature": "(self) -> 'list[Location]'" + }, + "build123d.build_line.BuildLine.face": { + "name": "face", + "owner": "build123d.build_line.BuildLine", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_line.py", + "source_line": 109, + "signature": "(self, *args)" + }, + "build123d.build_line.BuildLine.faces": { + "name": "faces", + "owner": "build123d.build_line.BuildLine", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_line.py", + "source_line": 105, + "signature": "(self, *args)" + }, + "build123d.build_line.BuildLine.line": { + "name": "line", + "owner": "build123d.build_line.BuildLine", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_line.py", + "source_line": 80, + "signature": "(self) -> 'Curve | None'" + }, + "build123d.build_line.BuildLine.line_local": { + "name": "line_local", + "owner": "build123d.build_line.BuildLine", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_line.py", + "source_line": 90, + "signature": "(self) -> 'Curve | None'" + }, + "build123d.build_line.BuildLine.solid": { + "name": "solid", + "owner": "build123d.build_line.BuildLine", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_line.py", + "source_line": 117, + "signature": "(self, *args)" + }, + "build123d.build_line.BuildLine.solids": { + "name": "solids", + "owner": "build123d.build_line.BuildLine", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_line.py", + "source_line": 113, + "signature": "(self, *args)" + }, + "build123d.build_part.BuildPart.location": { + "name": "location", + "owner": "build123d.build_part.BuildPart", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_part.py", + "source_line": 106, + "signature": "(self) -> 'Location'" + }, + "build123d.build_part.BuildPart.part": { + "name": "part", + "owner": "build123d.build_part.BuildPart", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_part.py", + "source_line": 76, + "signature": "(self) -> 'Part | None'" + }, + "build123d.build_part.BuildPart.part_local": { + "name": "part_local", + "owner": "build123d.build_part.BuildPart", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_part.py", + "source_line": 86, + "signature": "(self) -> 'Part | None'" + }, + "build123d.build_part.BuildPart.pending_edges_as_wire": { + "name": "pending_edges_as_wire", + "owner": "build123d.build_part.BuildPart", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_part.py", + "source_line": 101, + "signature": "(self) -> 'Wire'" + }, + "build123d.build_sketch.BuildSketch.consolidate_edges": { + "name": "consolidate_edges", + "owner": "build123d.build_sketch.BuildSketch", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_sketch.py", + "source_line": 110, + "signature": "(self) -> 'Wire | list[Wire]'" + }, + "build123d.build_sketch.BuildSketch.sketch": { + "name": "sketch", + "owner": "build123d.build_sketch.BuildSketch", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_sketch.py", + "source_line": 97, + "signature": "(self)" + }, + "build123d.build_sketch.BuildSketch.sketch_local": { + "name": "sketch_local", + "owner": "build123d.build_sketch.BuildSketch", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/build_sketch.py", + "source_line": 77, + "signature": "(self) -> 'Sketch | None'" + }, + "build123d.build_sketch.BuildSketch.solid": { + "name": "solid", + "owner": "build123d.build_sketch.BuildSketch", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_sketch.py", + "source_line": 106, + "signature": "(self, *args)" + }, + "build123d.build_sketch.BuildSketch.solids": { + "name": "solids", + "owner": "build123d.build_sketch.BuildSketch", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/build_sketch.py", + "source_line": 102, + "signature": "(self, *args)" + }, + "build123d.topology.composite.Curve.__add__": { + "name": "__add__", + "owner": "build123d.topology.composite.Curve", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 682, + "signature": "(self, other: 'None | Shape | Iterable[Shape]') -> 'Edge | Wire | Curve | Self'" + }, + "build123d.topology.composite.Compound.__and__": { + "name": "__and__", + "owner": "build123d.topology.composite.Compound", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 544, + "signature": "(self, other: 'Shape | Iterable[Shape]') -> 'Compound'" + }, + "build123d.topology.composite.Curve.__matmul__": { + "name": "__matmul__", + "owner": "build123d.topology.composite.Curve", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 968, + "signature": "(self, position: 'float') -> 'Vector'" + }, + "build123d.topology.composite.Curve.__mod__": { + "name": "__mod__", + "owner": "build123d.topology.composite.Curve", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 972, + "signature": "(self, position: 'float') -> 'Vector'" + }, + "build123d.topology.composite.Compound.__sub__": { + "name": "__sub__", + "owner": "build123d.topology.composite.Compound", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 594, + "signature": "(self, other: 'None | Shape | Iterable[Shape]') -> 'Compound'" + }, + "build123d.topology.composite.Curve.__xor__": { + "name": "__xor__", + "owner": "build123d.topology.composite.Curve", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 976, + "signature": "(self, position: 'float') -> 'Location'" + }, + "build123d.topology.composite.Compound.center": { + "name": "center", + "owner": "build123d.topology.composite.Compound", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 603, + "signature": "(self, center_of: 'CenterOf' = ) -> 'Vector'" + }, + "build123d.topology.composite.Compound.compound": { + "name": "compound", + "owner": "build123d.topology.composite.Compound", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 632, + "signature": "(self) -> 'Compound'" + }, + "build123d.topology.composite.Compound.compounds": { + "name": "compounds", + "owner": "build123d.topology.composite.Compound", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 640, + "signature": "(self) -> 'ShapeList[Compound]'" + }, + "build123d.topology.composite.Compound.do_children_intersect": { + "name": "do_children_intersect", + "owner": "build123d.topology.composite.Compound", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 652, + "signature": "(self, include_parent: 'bool' = False, tolerance: 'float' = 1e-05) -> 'tuple[bool, tuple[Shape | None, Shape | None], float]'" + }, + "build123d.topology.composite.Compound.extrude": { + "name": "extrude", + "owner": "build123d.topology.composite.Compound", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 212, + "signature": "(cls, obj: 'Shell', direction: 'VectorLike') -> 'Compound'" + }, + "build123d.topology.composite.Compound.get_type": { + "name": "get_type", + "owner": "build123d.topology.composite.Compound", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 703, + "signature": "(self, obj_type: 'type[Vertex] | type[Edge] | type[Face] | type[Shell] | type[Solid] | type[Wire]') -> 'list[Vertex | Edge | Face | Shell | Solid | Wire]'" + }, + "build123d.topology.composite.Compound.make_text": { + "name": "make_text", + "owner": "build123d.topology.composite.Compound", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 266, + "signature": "(cls, txt: 'str', font_size: 'float', font: 'str' = 'Arial', font_path: 'PathLike[str] | str | None' = None, font_style: 'FontStyle' = , text_align: 'tuple[TextAlign, TextAlign]' = (, ), align: 'Align | tuple[Align, Align] | None' = None, position_on_path: 'float' = 0.0, text_path: 'Edge | Wire | None' = None, single_line_width: 'float' = 0.0) -> 'Compound'" + }, + "build123d.topology.composite.Compound.make_triad": { + "name": "make_triad", + "owner": "build123d.topology.composite.Compound", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 437, + "signature": "(cls, axes_scale: 'float') -> 'Compound'" + }, + "build123d.topology.composite.Compound.mass": { + "name": "mass", + "owner": "build123d.topology.composite.Compound", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 190, + "signature": "(self, mass_unit: 'Unit' = , length_unit: 'Unit' = ) -> 'float'" + }, + "build123d.topology.composite.Compound.project_to_viewport": { + "name": "project_to_viewport", + "owner": "build123d.topology.composite.Compound", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 833, + "signature": "(self, viewport_origin: 'VectorLike', viewport_up: 'VectorLike' = (0, 0, 1), look_at: 'VectorLike | None' = None, focus: 'float | None' = None) -> 'tuple[ShapeList[Edge], ShapeList[Edge]]'" + }, + "build123d.topology.composite.Compound.resolve_font": { + "name": "resolve_font", + "owner": "build123d.topology.composite.Compound", + "category": "query_or_utility", + "descriptor": "staticmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 230, + "signature": "(font: 'str' = 'Arial', font_path: 'PathLike[str] | str | None' = None, font_style: 'FontStyle' = ) -> 'tuple[str, str, Font_SystemFont]'" + }, + "build123d.topology.composite.Compound.touch": { + "name": "touch", + "owner": "build123d.topology.composite.Compound", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 808, + "signature": "(self, other: 'Shape', tolerance: 'float' = 1e-06) -> 'ShapeList[Vertex | Edge | Face]'" + }, + "build123d.topology.composite.Compound.unwrap": { + "name": "unwrap", + "owner": "build123d.topology.composite.Compound", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 860, + "signature": "(self, fully: 'bool' = True) -> 'Self | Shape'" + }, + "build123d.topology.composite.Compound.volume": { + "name": "volume", + "owner": "build123d.topology.composite.Compound", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 184, + "signature": "(self) -> 'float'" + }, + "build123d.topology.composite.Curve.wires": { + "name": "wires", + "owner": "build123d.topology.composite.Curve", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 980, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Wire]'" + }, + "build123d.topology.one_d.Edge.arc_center": { + "name": "arc_center", + "owner": "build123d.topology.one_d.Edge", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1684, + "signature": "(self) -> 'Vector'" + }, + "build123d.topology.one_d.Edge.close": { + "name": "close", + "owner": "build123d.topology.one_d.Edge", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2744, + "signature": "(self) -> 'Edge | Wire'" + }, + "build123d.topology.one_d.Edge.distribute_locations": { + "name": "distribute_locations", + "owner": "build123d.topology.one_d.Edge", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2753, + "signature": "(self: 'Wire | Edge', count: 'int', start: 'float' = 0.0, stop: 'float' = 1.0, positions_only: 'bool' = False) -> 'list[Location]'" + }, + "build123d.topology.one_d.Edge.extrude": { + "name": "extrude", + "owner": "build123d.topology.one_d.Edge", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1702, + "signature": "(cls, obj: 'Vertex', direction: 'VectorLike') -> 'Edge'" + }, + "build123d.topology.one_d.Edge.find_intersection_points": { + "name": "find_intersection_points", + "owner": "build123d.topology.one_d.Edge", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2836, + "signature": "(self, other: 'Axis | Edge | None' = None, tolerance: 'float' = 1e-06) -> 'ShapeList[Vector]'" + }, + "build123d.topology.one_d.Edge.find_tangent": { + "name": "find_tangent", + "owner": "build123d.topology.one_d.Edge", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2920, + "signature": "(self, angle: 'float') -> 'list[float]'" + }, + "build123d.topology.one_d.Edge.geom_adaptor": { + "name": "geom_adaptor", + "owner": "build123d.topology.one_d.Edge", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2980, + "signature": "(self) -> 'BRepAdaptor_Curve'" + }, + "build123d.topology.one_d.Edge.geom_equal": { + "name": "geom_equal", + "owner": "build123d.topology.one_d.Edge", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2986, + "signature": "(self, other: 'Edge', tol: 'float' = 1e-06, num_interpolation_points: 'int' = 5) -> 'bool'" + }, + "build123d.topology.one_d.Edge.is_infinite": { + "name": "is_infinite", + "owner": "build123d.topology.one_d.Edge", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3497, + "signature": "(self) -> 'bool'" + }, + "build123d.topology.one_d.Edge.make_bezier": { + "name": "make_bezier", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1722, + "signature": "(cls, *cntl_pnts: 'VectorLike', weights: 'list[float] | None' = None) -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_bspline": { + "name": "make_bspline", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2566, + "signature": "(cls, control_points: 'Iterable[VectorLike]', knots: 'Iterable[float]', degree: 'int', weights: 'Iterable[float] | None' = None, periodic: 'bool' = False) -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_circle": { + "name": "make_circle", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1771, + "signature": "(cls, radius: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)), start_angle: 'float' = 360.0, end_angle: 'float' = 360, angular_direction: 'AngularDirection' = ) -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_constrained_arcs": { + "name": "make_constrained_arcs", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 1942, + "signature": "(cls, *args, sagitta: 'Sagitta' = , **kwargs) -> 'ShapeList[Edge]'" + }, + "build123d.topology.one_d.Edge.make_constrained_lines": { + "name": "make_constrained_lines", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2119, + "signature": "(cls, *args, **kwargs) -> 'ShapeList[Edge]'" + }, + "build123d.topology.one_d.Edge.make_ellipse": { + "name": "make_ellipse", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2204, + "signature": "(cls, x_radius: 'float', y_radius: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)), start_angle: 'float' = 360.0, end_angle: 'float' = 360.0, angular_direction: 'AngularDirection' = ) -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_helix": { + "name": "make_helix", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2361, + "signature": "(cls, pitch: 'float', height: 'float', radius: 'float', center: 'VectorLike' = (0, 0, 0), normal: 'VectorLike' = (0, 0, 1), angle: 'float' = 0.0, lefthand: 'bool' = False) -> 'Wire'" + }, + "build123d.topology.one_d.Edge.make_hyperbola": { + "name": "make_hyperbola", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2308, + "signature": "(cls, x_radius: 'float', y_radius: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)), start_angle: 'float' = 360.0, end_angle: 'float' = 360.0, angular_direction: 'AngularDirection' = ) -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_line": { + "name": "make_line", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2425, + "signature": "(cls, point1: 'VectorLike', point2: 'VectorLike') -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_mid_way": { + "name": "make_mid_way", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2443, + "signature": "(cls, first: 'Edge', second: 'Edge', middle: 'float' = 0.5) -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_parabola": { + "name": "make_parabola", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2271, + "signature": "(cls, focal_length: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)), start_angle: 'float' = 0.0, end_angle: 'float' = 90.0, angular_direction: 'AngularDirection' = ) -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_spline": { + "name": "make_spline", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2468, + "signature": "(cls, points: 'list[VectorLike]', tangents: 'list[VectorLike] | None' = None, periodic: 'bool' = False, parameters: 'list[float] | None' = None, scale: 'bool' = True, tol: 'float' = 1e-06) -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_spline_approx": { + "name": "make_spline_approx", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2645, + "signature": "(cls, points: 'list[VectorLike]', tol: 'float' = 0.001, smoothing: 'tuple[float, float, float] | None' = None, min_deg: 'int' = 1, max_deg: 'int' = 6) -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_tangent_arc": { + "name": "make_tangent_arc", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2698, + "signature": "(cls, start: 'VectorLike', tangent: 'VectorLike', end: 'VectorLike') -> 'Edge'" + }, + "build123d.topology.one_d.Edge.make_three_point_arc": { + "name": "make_three_point_arc", + "owner": "build123d.topology.one_d.Edge", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 2720, + "signature": "(cls, point1: 'VectorLike', point2: 'VectorLike', point3: 'VectorLike') -> 'Edge'" + }, + "build123d.topology.one_d.Edge.param_at": { + "name": "param_at", + "owner": "build123d.topology.one_d.Edge", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3156, + "signature": "(self, position: 'float') -> 'float'" + }, + "build123d.topology.one_d.Edge.param_at_point": { + "name": "param_at_point", + "owner": "build123d.topology.one_d.Edge", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3185, + "signature": "(self, point: 'VectorLike') -> 'float'" + }, + "build123d.topology.one_d.Edge.project_to_shape": { + "name": "project_to_shape", + "owner": "build123d.topology.one_d.Edge", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3315, + "signature": "(self, target_object: 'Shape', direction: 'VectorLike | None' = None, center: 'VectorLike | None' = None) -> 'ShapeList[Edge]'" + }, + "build123d.topology.one_d.Edge.reversed": { + "name": "reversed", + "owner": "build123d.topology.one_d.Edge", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3349, + "signature": "(self, reconstruct: 'bool' = False) -> 'Edge'" + }, + "build123d.topology.one_d.Edge.trim": { + "name": "trim", + "owner": "build123d.topology.one_d.Edge", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3380, + "signature": "(self, start: 'float | VectorLike', end: 'float | VectorLike') -> 'Edge'" + }, + "build123d.topology.one_d.Edge.trim_infinite": { + "name": "trim_infinite", + "owner": "build123d.topology.one_d.Edge", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3502, + "signature": "(self, half_length: 'float') -> 'Edge'" + }, + "build123d.topology.one_d.Edge.trim_to_length": { + "name": "trim_to_length", + "owner": "build123d.topology.one_d.Edge", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3428, + "signature": "(self, start: 'float | VectorLike', length: 'float') -> 'Edge'" + }, + "build123d.topology.one_d.Edge.trim_to_other": { + "name": "trim_to_other", + "owner": "build123d.topology.one_d.Edge", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3472, + "signature": "(self: 'Edge', other: 'Shape | Axis | Location | Plane | VectorLike') -> 'Edge | None'" + }, + "build123d.topology.one_d.Wire.chamfer_2d": { + "name": "chamfer_2d", + "owner": "build123d.topology.one_d.Wire", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4041, + "signature": "(self, distance: 'float', distance2: 'float', vertices: 'Iterable[Vertex]', edge: 'Edge | None' = None) -> 'Wire'" + }, + "build123d.topology.one_d.Wire.close": { + "name": "close", + "owner": "build123d.topology.one_d.Wire", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4111, + "signature": "(self) -> 'Wire'" + }, + "build123d.topology.one_d.Wire.combine": { + "name": "combine", + "owner": "build123d.topology.one_d.Wire", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3764, + "signature": "(cls, wires: 'Iterable[Wire | Edge]', tol: 'float' = 1e-09) -> 'ShapeList[Wire]'" + }, + "build123d.topology.one_d.Wire.edges": { + "name": "edges", + "owner": "build123d.topology.one_d.Wire", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4121, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Edge]'" + }, + "build123d.topology.one_d.Wire.extrude": { + "name": "extrude", + "owner": "build123d.topology.one_d.Wire", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3795, + "signature": "(cls, obj: 'Shape', direction: 'VectorLike') -> 'Wire'" + }, + "build123d.topology.one_d.Wire.fillet_2d": { + "name": "fillet_2d", + "owner": "build123d.topology.one_d.Wire", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4135, + "signature": "(self, radius: 'float', vertices: 'Iterable[Vertex]') -> 'Wire'" + }, + "build123d.topology.one_d.Wire.fix_degenerate_edges": { + "name": "fix_degenerate_edges", + "owner": "build123d.topology.one_d.Wire", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4203, + "signature": "(self, precision: 'float') -> 'Wire'" + }, + "build123d.topology.one_d.Wire.geom_adaptor": { + "name": "geom_adaptor", + "owner": "build123d.topology.one_d.Wire", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4224, + "signature": "(self) -> 'BRepAdaptor_CompCurve'" + }, + "build123d.topology.one_d.Wire.geom_equal": { + "name": "geom_equal", + "owner": "build123d.topology.one_d.Wire", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4246, + "signature": "(self, other: 'Wire', tol: 'float' = 1e-06, num_interpolation_points: 'int' = 5) -> 'bool'" + }, + "build123d.topology.one_d.Wire.make_circle": { + "name": "make_circle", + "owner": "build123d.topology.one_d.Wire", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3800, + "signature": "(cls, radius: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1))) -> 'Wire'" + }, + "build123d.topology.one_d.Wire.make_convex_hull": { + "name": "make_convex_hull", + "owner": "build123d.topology.one_d.Wire", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3816, + "signature": "(cls, edges: 'Iterable[Edge]', tolerance: 'float' = 0.001) -> 'Wire'" + }, + "build123d.topology.one_d.Wire.make_ellipse": { + "name": "make_ellipse", + "owner": "build123d.topology.one_d.Wire", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3933, + "signature": "(cls, x_radius: 'float', y_radius: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)), start_angle: 'float' = 360.0, end_angle: 'float' = 360.0, angular_direction: 'AngularDirection' = , closed: 'bool' = True) -> 'Wire'" + }, + "build123d.topology.one_d.Wire.make_polygon": { + "name": "make_polygon", + "owner": "build123d.topology.one_d.Wire", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3973, + "signature": "(cls, vertices: 'Iterable[VectorLike]', close: 'bool' = True) -> 'Wire'" + }, + "build123d.topology.one_d.Wire.make_rect": { + "name": "make_rect", + "owner": "build123d.topology.one_d.Wire", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 3996, + "signature": "(cls, width: 'float', height: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1))) -> 'Wire'" + }, + "build123d.topology.one_d.Wire.order_chamfer_edges": { + "name": "order_chamfer_edges", + "owner": "build123d.topology.one_d.Wire", + "category": "query_or_utility", + "descriptor": "staticmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4025, + "signature": "(reference_edge: 'Edge | None', edges: 'tuple[Edge, Edge]') -> 'tuple[Edge, Edge]'" + }, + "build123d.topology.one_d.Wire.order_edges": { + "name": "order_edges", + "owner": "build123d.topology.one_d.Wire", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4231, + "signature": "(self) -> 'ShapeList[Edge]'" + }, + "build123d.topology.one_d.Wire.param_at": { + "name": "param_at", + "owner": "build123d.topology.one_d.Wire", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4280, + "signature": "(self, position: 'float') -> 'float'" + }, + "build123d.topology.one_d.Wire.param_at_point": { + "name": "param_at_point", + "owner": "build123d.topology.one_d.Wire", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4314, + "signature": "(self, point: 'VectorLike') -> 'float'" + }, + "build123d.topology.one_d.Wire.project_to_shape": { + "name": "project_to_shape", + "owner": "build123d.topology.one_d.Wire", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4482, + "signature": "(self, target_object: 'Shape', direction: 'VectorLike | None' = None, center: 'VectorLike | None' = None) -> 'ShapeList[Wire]'" + }, + "build123d.topology.one_d.Wire.stitch": { + "name": "stitch", + "owner": "build123d.topology.one_d.Wire", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4593, + "signature": "(self, other: 'Wire') -> 'Wire'" + }, + "build123d.topology.one_d.Wire.trim": { + "name": "trim", + "owner": "build123d.topology.one_d.Wire", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/one_d.py", + "source_line": 4675, + "signature": "(self: 'Wire', start: 'float | VectorLike', end: 'float | VectorLike') -> 'Wire'" + }, + "build123d.objects_curve.Airfoil.camber_line": { + "name": "camber_line", + "owner": "build123d.objects_curve.Airfoil", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 234, + "signature": "(self) -> 'Edge'" + }, + "build123d.objects_curve.Airfoil.parse_naca4": { + "name": "parse_naca4", + "owner": "build123d.objects_curve.Airfoil", + "category": "query_or_utility", + "descriptor": "staticmethod", + "conversion_status": "unverified", + "source_file": "build123d/objects_curve.py", + "source_line": 143, + "signature": "(value: 'str | float') -> 'tuple[float, float, float]'" + }, + "build123d.topology.composite.Compound.__add__": { + "name": "__add__", + "owner": "build123d.topology.composite.Compound", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/composite.py", + "source_line": 490, + "signature": "(self, other: 'None | Shape | Iterable[Shape]') -> 'Compound | Wire'" + }, + "build123d.drafting.Draft.is_metric": { + "name": "is_metric", + "owner": "build123d.drafting.Draft", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/drafting.py", + "source_line": 207, + "signature": "(self) -> bool" + }, + "build123d.geometry.BoundBox.add": { + "name": "add", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1165, + "signature": "(self, obj: 'tuple[float, float, float] | Vector | BoundBox', tol: 'float | None' = None) -> 'BoundBox'" + }, + "build123d.geometry.BoundBox.center": { + "name": "center", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1161, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.BoundBox.contains": { + "name": "contains", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1316, + "signature": "(self, other: 'BoundBox', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.BoundBox.contains_properly": { + "name": "contains_properly", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1326, + "signature": "(self, other: 'BoundBox', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.BoundBox.covered_by": { + "name": "covered_by", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1312, + "signature": "(self, other: 'BoundBox', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.BoundBox.covers": { + "name": "covers", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1297, + "signature": "(self, other: 'BoundBox', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.BoundBox.diagonal": { + "name": "diagonal", + "owner": "build123d.geometry.BoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1147, + "signature": "(self) -> 'float'" + }, + "build123d.geometry.BoundBox.disjoint": { + "name": "disjoint", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1348, + "signature": "(self, other: 'BoundBox', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.BoundBox.find_outside_box_2d": { + "name": "find_outside_box_2d", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "staticmethod", + "conversion_status": "unverified", + "source_file": "typing_extensions.py", + "source_line": 1204, + "signature": "(bb1: 'BoundBox', bb2: 'BoundBox') -> 'BoundBox | None'" + }, + "build123d.geometry.BoundBox.from_topo_ds": { + "name": "from_topo_ds", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1243, + "signature": "(cls, shape: 'TopoDS_Shape', tolerance: 'float | None' = None, optimal: 'bool' = True) -> 'BoundBox'" + }, + "build123d.geometry.BoundBox.intersects": { + "name": "intersects", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1342, + "signature": "(self, other: 'BoundBox', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.BoundBox.is_inside": { + "name": "is_inside", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "typing_extensions.py", + "source_line": 1366, + "signature": "(self, other: 'BoundBox', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.BoundBox.measure": { + "name": "measure", + "owner": "build123d.geometry.BoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1137, + "signature": "(self) -> 'float'" + }, + "build123d.geometry.BoundBox.overlaps": { + "name": "overlaps", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1358, + "signature": "(self, other: 'BoundBox', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.BoundBox.to_align_offset": { + "name": "to_align_offset", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1375, + "signature": "(self, align: 'Align2D | Align3D') -> 'Vector'" + }, + "build123d.geometry.BoundBox.touches": { + "name": "touches", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1352, + "signature": "(self, other: 'BoundBox', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.BoundBox.within": { + "name": "within", + "owner": "build123d.geometry.BoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1338, + "signature": "(self, other: 'BoundBox', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.OrientedBoundBox.center": { + "name": "center", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2369, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.OrientedBoundBox.corners": { + "name": "corners", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2250, + "signature": "(self) -> 'list[Vector]'" + }, + "build123d.geometry.OrientedBoundBox.diagonal": { + "name": "diagonal", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2286, + "signature": "(self) -> 'float'" + }, + "build123d.geometry.OrientedBoundBox.is_completely_inside": { + "name": "is_completely_inside", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2380, + "signature": "(self, other: 'OrientedBoundBox') -> 'bool'" + }, + "build123d.geometry.OrientedBoundBox.is_outside": { + "name": "is_outside", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2400, + "signature": "(self, point: 'Vector') -> 'bool'" + }, + "build123d.geometry.OrientedBoundBox.location": { + "name": "location", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2297, + "signature": "(self) -> 'Location'" + }, + "build123d.geometry.OrientedBoundBox.plane": { + "name": "plane", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2307, + "signature": "(self) -> 'Plane'" + }, + "build123d.geometry.OrientedBoundBox.size": { + "name": "size", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2320, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.OrientedBoundBox.wrapped": { + "name": "wrapped", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2245, + "signature": "(self)" + }, + "build123d.geometry.OrientedBoundBox.x_direction": { + "name": "x_direction", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2333, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.OrientedBoundBox.y_direction": { + "name": "y_direction", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2345, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.OrientedBoundBox.z_direction": { + "name": "z_direction", + "owner": "build123d.geometry.OrientedBoundBox", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2357, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Location.__and__": { + "name": "__and__", + "owner": "build123d.geometry.Location", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2101, + "signature": "(self, other: 'Axis | Location | Plane | VectorLike | Shape') -> 'Vector | Location | None'" + }, + "build123d.geometry.Location.__mul__": { + "name": "__mul__", + "owner": "build123d.geometry.Location", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2031, + "signature": "(self, other: 'Any') -> 'Any'" + }, + "build123d.geometry.Location.__neg__": { + "name": "__neg__", + "owner": "build123d.geometry.Location", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2097, + "signature": "(self) -> 'Location'" + }, + "build123d.geometry.Location.center": { + "name": "center", + "owner": "build123d.geometry.Location", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2107, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Location.intersect": { + "name": "intersect", + "owner": "build123d.geometry.Location", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2191, + "signature": "(self, *args, **kwargs)" + }, + "build123d.geometry.Location.inverse": { + "name": "inverse", + "owner": "build123d.geometry.Location", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2001, + "signature": "(self) -> 'Location'" + }, + "build123d.geometry.Location.mirror": { + "name": "mirror", + "owner": "build123d.geometry.Location", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2111, + "signature": "(self, mirror_plane: 'Plane') -> 'Location'" + }, + "build123d.geometry.Location.orientation": { + "name": "orientation", + "owner": "build123d.geometry.Location", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1951, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Location.position": { + "name": "position", + "owner": "build123d.geometry.Location", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1928, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Location.wrapped": { + "name": "wrapped", + "owner": "build123d.geometry.Location", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1923, + "signature": "(self) -> 'TopLoc_Location'" + }, + "build123d.geometry.Location.x_axis": { + "name": "x_axis", + "owner": "build123d.geometry.Location", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1983, + "signature": "(self) -> 'Axis'" + }, + "build123d.geometry.Location.y_axis": { + "name": "y_axis", + "owner": "build123d.geometry.Location", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1989, + "signature": "(self) -> 'Axis'" + }, + "build123d.geometry.Location.z_axis": { + "name": "z_axis", + "owner": "build123d.geometry.Location", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1995, + "signature": "(self) -> 'Axis'" + }, + "build123d.topology.shape_core.ShapeList.__add__": { + "name": "__add__", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3320, + "signature": "(self, other: 'Shape | Iterable[Shape]') -> 'ShapeList[T]'" + }, + "build123d.topology.shape_core.ShapeList.__and__": { + "name": "__and__", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3342, + "signature": "(self, other: 'ShapeList') -> 'ShapeList[T]'" + }, + "build123d.topology.shape_core.ShapeList.__sub__": { + "name": "__sub__", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3394, + "signature": "(self, other: 'ShapeList') -> 'ShapeList[T]'" + }, + "build123d.topology.shape_core.ShapeList.center": { + "name": "center", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3421, + "signature": "(self) -> 'Vector'" + }, + "build123d.topology.shape_core.ShapeList.compound": { + "name": "compound", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3429, + "signature": "(self) -> 'Compound'" + }, + "build123d.topology.shape_core.ShapeList.compounds": { + "name": "compounds", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3437, + "signature": "(self) -> 'ShapeList[Compound]'" + }, + "build123d.topology.shape_core.ShapeList.edge": { + "name": "edge", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3441, + "signature": "(self) -> 'Edge'" + }, + "build123d.topology.shape_core.ShapeList.edges": { + "name": "edges", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3449, + "signature": "(self) -> 'ShapeList[Edge]'" + }, + "build123d.topology.shape_core.ShapeList.expand": { + "name": "expand", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3398, + "signature": "(self) -> 'ShapeList'" + }, + "build123d.topology.shape_core.ShapeList.face": { + "name": "face", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3453, + "signature": "(self) -> 'Face'" + }, + "build123d.topology.shape_core.ShapeList.faces": { + "name": "faces", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3461, + "signature": "(self) -> 'ShapeList[Face]'" + }, + "build123d.topology.shape_core.ShapeList.filter_by": { + "name": "filter_by", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3465, + "signature": "(self, filter_by: 'Callable[[T], bool] | Axis | Plane | GeomType | Convexity | property', reverse: 'bool' = False, tolerance: 'float' = 1e-05) -> 'ShapeList[T]'" + }, + "build123d.topology.shape_core.ShapeList.filter_by_position": { + "name": "filter_by_position", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3610, + "signature": "(self, axis: 'Axis', minimum: 'float', maximum: 'float', inclusive: 'tuple[bool, bool]' = (True, True)) -> 'ShapeList[T]'" + }, + "build123d.topology.shape_core.ShapeList.first": { + "name": "first", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3308, + "signature": "(self) -> 'T'" + }, + "build123d.topology.shape_core.ShapeList.group_by": { + "name": "group_by", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3661, + "signature": "(self, group_by: 'Callable[[T], K] | Axis | Edge | Wire | SortBy | property' = Axis((0, 0, 0), (0, 0, 1)), reverse: 'bool' = False, tol_digits: 'int' = 6) -> 'GroupBy[T, K]'" + }, + "build123d.topology.shape_core.ShapeList.last": { + "name": "last", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3313, + "signature": "(self) -> 'T'" + }, + "build123d.topology.shape_core.ShapeList.shell": { + "name": "shell", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3767, + "signature": "(self) -> 'Shell'" + }, + "build123d.topology.shape_core.ShapeList.shells": { + "name": "shells", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3775, + "signature": "(self) -> 'ShapeList[Shell]'" + }, + "build123d.topology.shape_core.ShapeList.solid": { + "name": "solid", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3779, + "signature": "(self) -> 'Solid'" + }, + "build123d.topology.shape_core.ShapeList.solids": { + "name": "solids", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3787, + "signature": "(self) -> 'ShapeList[Solid]'" + }, + "build123d.topology.shape_core.ShapeList.sort_by": { + "name": "sort_by", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3791, + "signature": "(self, sort_by: 'Callable[[T], K] | Axis | Edge | Wire | SortBy | property' = Axis((0, 0, 0), (0, 0, 1)), reverse: 'bool' = False) -> 'ShapeList[T]'" + }, + "build123d.topology.shape_core.ShapeList.sort_by_distance": { + "name": "sort_by_distance", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3890, + "signature": "(self, other: 'Shape | VectorLike', reverse: 'bool' = False) -> 'ShapeList[T]'" + }, + "build123d.topology.shape_core.ShapeList.vertex": { + "name": "vertex", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3911, + "signature": "(self) -> 'Vertex'" + }, + "build123d.topology.shape_core.ShapeList.vertices": { + "name": "vertices", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3919, + "signature": "(self) -> 'ShapeList[Vertex]'" + }, + "build123d.topology.shape_core.ShapeList.wire": { + "name": "wire", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3923, + "signature": "(self) -> 'Wire'" + }, + "build123d.topology.shape_core.ShapeList.wires": { + "name": "wires", + "owner": "build123d.topology.shape_core.ShapeList", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3931, + "signature": "(self) -> 'ShapeList[Wire]'" + }, + "build123d.geometry.Axis.__and__": { + "name": "__and__", + "owner": "build123d.geometry.Axis", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 950, + "signature": "(self, other: 'Axis | Location | Plane | VectorLike | Shape') -> 'Vector | Location | Axis | None'" + }, + "build123d.geometry.Axis.__neg__": { + "name": "__neg__", + "owner": "build123d.geometry.Axis", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 946, + "signature": "(self) -> 'Axis'" + }, + "build123d.geometry.Axis.angle_between": { + "name": "angle_between", + "owner": "build123d.geometry.Axis", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 928, + "signature": "(self, other: 'Axis') -> 'float'" + }, + "build123d.geometry.Axis.direction": { + "name": "direction", + "owner": "build123d.geometry.Axis", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 757, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Axis.intersect": { + "name": "intersect", + "owner": "build123d.geometry.Axis", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1012, + "signature": "(self, *args, **kwargs)" + }, + "build123d.geometry.Axis.is_coaxial": { + "name": "is_coaxial", + "owner": "build123d.geometry.Axis", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 819, + "signature": "(self, other: 'Axis', angular_tolerance: 'float' = 1e-05, linear_tolerance: 'float' = 1e-05) -> 'bool'" + }, + "build123d.geometry.Axis.is_normal": { + "name": "is_normal", + "owner": "build123d.geometry.Axis", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 842, + "signature": "(self, other: 'Axis', angular_tolerance: 'float' = 1e-05) -> 'bool'" + }, + "build123d.geometry.Axis.is_opposite": { + "name": "is_opposite", + "owner": "build123d.geometry.Axis", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 857, + "signature": "(self, other: 'Axis', angular_tolerance: 'float' = 1e-05) -> 'bool'" + }, + "build123d.geometry.Axis.is_parallel": { + "name": "is_parallel", + "owner": "build123d.geometry.Axis", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 873, + "signature": "(self, other: 'Axis', angular_tolerance: 'float' = 1e-05) -> 'bool'" + }, + "build123d.geometry.Axis.is_skew": { + "name": "is_skew", + "owner": "build123d.geometry.Axis", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 889, + "signature": "(self, other: 'Axis', tolerance: 'float' = 1e-05) -> 'bool'" + }, + "build123d.geometry.Axis.located": { + "name": "located", + "owner": "build123d.geometry.Axis", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 812, + "signature": "(self, new_location: 'Location')" + }, + "build123d.geometry.Axis.location": { + "name": "location", + "owner": "build123d.geometry.Axis", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 767, + "signature": "(self) -> 'Location'" + }, + "build123d.geometry.Axis.position": { + "name": "position", + "owner": "build123d.geometry.Axis", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 747, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Axis.reverse": { + "name": "reverse", + "owner": "build123d.geometry.Axis", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 942, + "signature": "(self) -> 'Axis'" + }, + "build123d.geometry.Axis.wrapped": { + "name": "wrapped", + "owner": "build123d.geometry.Axis", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 742, + "signature": "(self)" + }, + "build123d.geometry.Color.categorical_set": { + "name": "categorical_set", + "owner": "build123d.geometry.Color", + "category": "query_or_utility", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1569, + "signature": "(cls, color_count: 'int', starting_hue: 'ColorLike | float' = 0.0, alpha: 'float | Iterable[float]' = 1.0) -> 'list[Color]'" + }, + "build123d.geometry.Vector.X": { + "name": "X", + "owner": "build123d.geometry.Vector", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 260, + "signature": "(self) -> 'float'" + }, + "build123d.geometry.Vector.Y": { + "name": "Y", + "owner": "build123d.geometry.Vector", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 270, + "signature": "(self) -> 'float'" + }, + "build123d.geometry.Vector.Z": { + "name": "Z", + "owner": "build123d.geometry.Vector", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 280, + "signature": "(self) -> 'float'" + }, + "build123d.geometry.Vector.__add__": { + "name": "__add__", + "owner": "build123d.geometry.Vector", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 334, + "signature": "(self, vec: 'VectorLike') -> 'Vector'" + }, + "build123d.geometry.Vector.__and__": { + "name": "__and__", + "owner": "build123d.geometry.Vector", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 450, + "signature": "(self, other: 'Axis | Location | Plane | VectorLike | Shape')" + }, + "build123d.geometry.Vector.__mul__": { + "name": "__mul__", + "owner": "build123d.geometry.Vector", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 347, + "signature": "(self, scale: 'float') -> 'Vector'" + }, + "build123d.geometry.Vector.__neg__": { + "name": "__neg__", + "owner": "build123d.geometry.Vector", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 442, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Vector.__radd__": { + "name": "__radd__", + "owner": "build123d.geometry.Vector", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 338, + "signature": "(self, vec: 'Vector') -> 'Vector'" + }, + "build123d.geometry.Vector.__rmul__": { + "name": "__rmul__", + "owner": "build123d.geometry.Vector", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 355, + "signature": "(self, scale: 'float') -> 'Vector'" + }, + "build123d.geometry.Vector.__sub__": { + "name": "__sub__", + "owner": "build123d.geometry.Vector", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 319, + "signature": "(self, vec: 'VectorLike') -> 'Vector'" + }, + "build123d.geometry.Vector.add": { + "name": "add", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 323, + "signature": "(self, vec: 'VectorLike') -> 'Vector'" + }, + "build123d.geometry.Vector.center": { + "name": "center", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 367, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Vector.cross": { + "name": "cross", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 300, + "signature": "(self, vec: 'Vector') -> 'Vector'" + }, + "build123d.geometry.Vector.distance_to_plane": { + "name": "distance_to_plane", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 417, + "signature": "(self, plane: 'Plane') -> 'float'" + }, + "build123d.geometry.Vector.dot": { + "name": "dot", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 304, + "signature": "(self, vec: 'Vector') -> 'float'" + }, + "build123d.geometry.Vector.get_angle": { + "name": "get_angle", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 379, + "signature": "(self, vec: 'Vector') -> 'float'" + }, + "build123d.geometry.Vector.get_signed_angle": { + "name": "get_signed_angle", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 383, + "signature": "(self, vec: 'Vector', normal: 'Vector | None' = None) -> 'float'" + }, + "build123d.geometry.Vector.intersect": { + "name": "intersect", + "owner": "build123d.geometry.Vector", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 577, + "signature": "(self, *args, **kwargs)" + }, + "build123d.geometry.Vector.length": { + "name": "length", + "owner": "build123d.geometry.Vector", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 295, + "signature": "(self) -> 'float'" + }, + "build123d.geometry.Vector.multiply": { + "name": "multiply", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 343, + "signature": "(self, scale: 'float') -> 'Vector'" + }, + "build123d.geometry.Vector.normalized": { + "name": "normalized", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 359, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Vector.project_to_line": { + "name": "project_to_line", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 402, + "signature": "(self, line: 'Vector') -> 'Vector'" + }, + "build123d.geometry.Vector.project_to_plane": { + "name": "project_to_plane", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 425, + "signature": "(self, plane: 'Plane') -> 'Vector'" + }, + "build123d.geometry.Vector.reverse": { + "name": "reverse", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 363, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Vector.rotate": { + "name": "rotate", + "owner": "build123d.geometry.Vector", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 543, + "signature": "(self, axis: 'Axis', angle: 'float') -> 'Vector'" + }, + "build123d.geometry.Vector.signed_distance_from_plane": { + "name": "signed_distance_from_plane", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 421, + "signature": "(self, plane: 'Plane') -> 'float'" + }, + "build123d.geometry.Vector.sub": { + "name": "sub", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 308, + "signature": "(self, vec: 'VectorLike') -> 'Vector'" + }, + "build123d.geometry.Vector.to_dir": { + "name": "to_dir", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 515, + "signature": "(self) -> 'gp_Dir'" + }, + "build123d.geometry.Vector.to_pnt": { + "name": "to_pnt", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 511, + "signature": "(self) -> 'gp_Pnt'" + }, + "build123d.geometry.Vector.transform": { + "name": "transform", + "owner": "build123d.geometry.Vector", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 519, + "signature": "(self, affine_transform: 'Matrix', is_direction: 'bool' = False) -> 'Vector'" + }, + "build123d.geometry.Vector.wrapped": { + "name": "wrapped", + "owner": "build123d.geometry.Vector", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 290, + "signature": "(self) -> 'gp_Vec'" + }, + "build123d.topology.zero_d.Vertex.X": { + "name": "X", + "owner": "build123d.topology.zero_d.Vertex", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 289, + "signature": "(self) -> 'float'" + }, + "build123d.topology.zero_d.Vertex.Y": { + "name": "Y", + "owner": "build123d.topology.zero_d.Vertex", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 294, + "signature": "(self) -> 'float'" + }, + "build123d.topology.zero_d.Vertex.Z": { + "name": "Z", + "owner": "build123d.topology.zero_d.Vertex", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 299, + "signature": "(self) -> 'float'" + }, + "build123d.topology.zero_d.Vertex.__add__": { + "name": "__add__", + "owner": "build123d.topology.zero_d.Vertex", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 350, + "signature": "(self, other: 'Vertex | Vector | tuple[float, float, float]') -> 'Vertex'" + }, + "build123d.topology.zero_d.Vertex.__and__": { + "name": "__and__", + "owner": "build123d.topology.zero_d.Vertex", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 385, + "signature": "(self, *args, **kwargs)" + }, + "build123d.topology.zero_d.Vertex.__sub__": { + "name": "__sub__", + "owner": "build123d.topology.zero_d.Vertex", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 403, + "signature": "(self, other: 'Vertex | Vector | tuple') -> 'Vertex'" + }, + "build123d.topology.zero_d.Vertex.center": { + "name": "center", + "owner": "build123d.topology.zero_d.Vertex", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 433, + "signature": "(self) -> 'Vector'" + }, + "build123d.topology.zero_d.Vertex.convexity": { + "name": "convexity", + "owner": "build123d.topology.zero_d.Vertex", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 163, + "signature": "(self) -> 'Convexity'" + }, + "build123d.topology.zero_d.Vertex.extrude": { + "name": "extrude", + "owner": "build123d.topology.zero_d.Vertex", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 306, + "signature": "(cls, obj: 'Shape', direction: 'VectorLike') -> 'Vertex'" + }, + "build123d.topology.zero_d.Vertex.mass": { + "name": "mass", + "owner": "build123d.topology.zero_d.Vertex", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 158, + "signature": "(self, mass_unit: 'Unit' = , length_unit: 'Unit' = ) -> 'float'" + }, + "build123d.topology.zero_d.Vertex.split": { + "name": "split", + "owner": "build123d.topology.zero_d.Vertex", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 437, + "signature": "(self, tool: 'TrimmingTool', keep: 'Keep' = )" + }, + "build123d.topology.zero_d.Vertex.transform_shape": { + "name": "transform_shape", + "owner": "build123d.topology.zero_d.Vertex", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 441, + "signature": "(self, t_matrix: 'Matrix') -> 'Vertex'" + }, + "build123d.topology.zero_d.Vertex.vertex": { + "name": "vertex", + "owner": "build123d.topology.zero_d.Vertex", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 456, + "signature": "(self) -> 'Vertex'" + }, + "build123d.topology.zero_d.Vertex.vertices": { + "name": "vertices", + "owner": "build123d.topology.zero_d.Vertex", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 460, + "signature": "(self, select: 'Select' = ) -> 'ShapeList[Vertex]'" + }, + "build123d.topology.zero_d.Vertex.volume": { + "name": "volume", + "owner": "build123d.topology.zero_d.Vertex", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/zero_d.py", + "source_line": 153, + "signature": "(self) -> 'float'" + }, + "build123d.topology.two_d.Face.area_without_holes": { + "name": "area_without_holes", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 914, + "signature": "(self) -> 'float'" + }, + "build123d.topology.two_d.Face.axes_of_symmetry": { + "name": "axes_of_symmetry", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 962, + "signature": "(self) -> 'list[Axis]'" + }, + "build123d.topology.two_d.Face.axis_of_rotation": { + "name": "axis_of_rotation", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 931, + "signature": "(self) -> 'None | Axis'" + }, + "build123d.topology.two_d.Face.center": { + "name": "center", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1952, + "signature": "(self, center_of: 'CenterOf' = ) -> 'Vector'" + }, + "build123d.topology.two_d.Face.center_location": { + "name": "center_location", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1091, + "signature": "(self) -> 'Location'" + }, + "build123d.topology.two_d.Face.chamfer_2d": { + "name": "chamfer_2d", + "owner": "build123d.topology.two_d.Face", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1985, + "signature": "(self, distance: 'float', distance2: 'float', vertices: 'Iterable[Vertex]', edge: 'Edge | None' = None) -> 'Face'" + }, + "build123d.topology.two_d.Face.convexity": { + "name": "convexity", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1126, + "signature": "(self) -> 'Convexity'" + }, + "build123d.topology.two_d.Face.extrude": { + "name": "extrude", + "owner": "build123d.topology.two_d.Face", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1328, + "signature": "(cls, obj: 'Edge', direction: 'VectorLike') -> 'Face'" + }, + "build123d.topology.two_d.Face.fillet_2d": { + "name": "fillet_2d", + "owner": "build123d.topology.two_d.Face", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2045, + "signature": "(self, radius: 'float', vertices: 'Iterable[Vertex]') -> 'Face'" + }, + "build123d.topology.two_d.Face.geom_adaptor": { + "name": "geom_adaptor", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2087, + "signature": "(self) -> 'Geom_Surface'" + }, + "build123d.topology.two_d.Face.geometry": { + "name": "geometry", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1097, + "signature": "(self) -> 'None | str'" + }, + "build123d.topology.two_d.Face.inner_wires": { + "name": "inner_wires", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2091, + "signature": "(self) -> 'ShapeList[Wire]'" + }, + "build123d.topology.two_d.Face.is_circular_concave": { + "name": "is_circular_concave", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1196, + "signature": "(self) -> 'bool'" + }, + "build123d.topology.two_d.Face.is_circular_convex": { + "name": "is_circular_convex", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1187, + "signature": "(self) -> 'bool'" + }, + "build123d.topology.two_d.Face.is_coplanar": { + "name": "is_coplanar", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2099, + "signature": "(self, plane: 'Plane') -> 'bool'" + }, + "build123d.topology.two_d.Face.is_inside": { + "name": "is_inside", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2111, + "signature": "(self, point: 'VectorLike', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.topology.two_d.Face.is_planar": { + "name": "is_planar", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1205, + "signature": "(self) -> 'Plane | None'" + }, + "build123d.topology.two_d.Face.length": { + "name": "length", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1217, + "signature": "(self) -> 'None | float'" + }, + "build123d.topology.two_d.Face.location_at": { + "name": "location_at", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2148, + "signature": "(self, *args, **kwargs) -> 'Location'" + }, + "build123d.topology.two_d.Face.make_bezier_surface": { + "name": "make_bezier_surface", + "owner": "build123d.topology.two_d.Face", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1348, + "signature": "(cls, points: 'list[list[VectorLike]]', weights: 'list[list[float]] | None' = None) -> 'Face'" + }, + "build123d.topology.two_d.Face.make_gordon_surface": { + "name": "make_gordon_surface", + "owner": "build123d.topology.two_d.Face", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1397, + "signature": "(cls, profiles: 'Iterable[VectorLike | Edge]', guides: 'Iterable[VectorLike | Edge]', tolerance: 'float' = 0.0003) -> 'Face'" + }, + "build123d.topology.two_d.Face.make_holes": { + "name": "make_holes", + "owner": "build123d.topology.two_d.Face", + "category": "factory", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2239, + "signature": "(self, interior_wires: 'list[Wire]') -> 'Face'" + }, + "build123d.topology.two_d.Face.make_rect": { + "name": "make_rect", + "owner": "build123d.topology.two_d.Face", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1482, + "signature": "(cls, width: 'float', height: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1))) -> 'Face'" + }, + "build123d.topology.two_d.Face.make_surface": { + "name": "make_surface", + "owner": "build123d.topology.two_d.Face", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1555, + "signature": "(cls, exterior: 'Wire | Iterable[Edge]', surface_points: 'Iterable[VectorLike] | None' = None, interior_wires: 'Iterable[Wire] | None' = None) -> 'Face'" + }, + "build123d.topology.two_d.Face.make_surface_from_array_of_points": { + "name": "make_surface_from_array_of_points", + "owner": "build123d.topology.two_d.Face", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1647, + "signature": "(cls, points: 'list[list[VectorLike]]', tol: 'float' = 0.01, smoothing: 'tuple[float, float, float] | None' = None, min_deg: 'int' = 1, max_deg: 'int' = 3) -> 'Face'" + }, + "build123d.topology.two_d.Face.make_surface_from_curves": { + "name": "make_surface_from_curves", + "owner": "build123d.topology.two_d.Face", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1721, + "signature": "(cls, *args, **kwargs) -> 'Face'" + }, + "build123d.topology.two_d.Face.make_surface_patch": { + "name": "make_surface_patch", + "owner": "build123d.topology.two_d.Face", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1763, + "signature": "(cls, edge_face_constraints: 'Iterable[tuple[Edge, Face, ContinuityLevel]] | None' = None, edge_constraints: 'Iterable[Edge] | None' = None, point_constraints: 'Iterable[VectorLike] | None' = None) -> 'Face'" + }, + "build123d.topology.two_d.Face.mass": { + "name": "mass", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1310, + "signature": "(self, mass_unit: 'Unit' = , length_unit: 'Unit' = ) -> 'float'" + }, + "build123d.topology.two_d.Face.normal_at": { + "name": "normal_at", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2312, + "signature": "(self, *args, **kwargs) -> 'Vector'" + }, + "build123d.topology.two_d.Face.outer_wire": { + "name": "outer_wire", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2369, + "signature": "(self) -> 'Wire'" + }, + "build123d.topology.two_d.Face.position_at": { + "name": "position_at", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2375, + "signature": "(self, u: 'float', v: 'float') -> 'Vector'" + }, + "build123d.topology.two_d.Face.project_to_shape": { + "name": "project_to_shape", + "owner": "build123d.topology.two_d.Face", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2399, + "signature": "(self, target_object: 'Shape', direction: 'VectorLike') -> 'ShapeList[Face | Shell]'" + }, + "build123d.topology.two_d.Face.radii": { + "name": "radii", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1228, + "signature": "(self) -> 'None | tuple[float, float]'" + }, + "build123d.topology.two_d.Face.radius": { + "name": "radius", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1239, + "signature": "(self) -> 'None | float'" + }, + "build123d.topology.two_d.Face.revolve": { + "name": "revolve", + "owner": "build123d.topology.two_d.Face", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1835, + "signature": "(cls, profile: 'Edge', angle: 'float', axis: 'Axis') -> 'Face'" + }, + "build123d.topology.two_d.Face.seams": { + "name": "seams", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1248, + "signature": "(self: 'Face') -> 'ShapeList[Edge]'" + }, + "build123d.topology.two_d.Face.semi_angle": { + "name": "semi_angle", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1254, + "signature": "(self) -> 'None | float'" + }, + "build123d.topology.two_d.Face.sew_faces": { + "name": "sew_faces", + "owner": "build123d.topology.two_d.Face", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1863, + "signature": "(cls, faces: 'Iterable[Face]') -> 'list[ShapeList[Face]]'" + }, + "build123d.topology.two_d.Face.sweep": { + "name": "sweep", + "owner": "build123d.topology.two_d.Face", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1903, + "signature": "(cls, profile: 'Curve | Edge | Wire', path: 'Curve | Edge | Wire', transition=) -> 'Face'" + }, + "build123d.topology.two_d.Face.uv_face": { + "name": "uv_face", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1263, + "signature": "(self) -> 'Face'" + }, + "build123d.topology.two_d.Face.volume": { + "name": "volume", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1305, + "signature": "(self) -> 'float'" + }, + "build123d.topology.two_d.Face.width": { + "name": "width", + "owner": "build123d.topology.two_d.Face", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 1315, + "signature": "(self) -> 'None | float'" + }, + "build123d.topology.two_d.Face.wire": { + "name": "wire", + "owner": "build123d.topology.two_d.Face", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2484, + "signature": "(self) -> 'Wire'" + }, + "build123d.topology.two_d.Face.without_holes": { + "name": "without_holes", + "owner": "build123d.topology.two_d.Face", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2461, + "signature": "(self) -> 'Face'" + }, + "build123d.topology.two_d.Face.wrap": { + "name": "wrap", + "owner": "build123d.topology.two_d.Face", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2518, + "signature": "(self, planar_shape: 'T', surface_loc: 'Location', tolerance: 'float' = 0.001, extension_factor: 'float' = 0.1) -> 'T'" + }, + "build123d.topology.two_d.Face.wrap_faces": { + "name": "wrap_faces", + "owner": "build123d.topology.two_d.Face", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2577, + "signature": "(self, faces: 'Iterable[Face]', path: 'Wire | Edge', start: 'float' = 0.0) -> 'ShapeList[Face]'" + }, + "build123d.geometry.Matrix.inverse": { + "name": "inverse", + "owner": "build123d.geometry.Matrix", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2703, + "signature": "(self) -> 'Matrix'" + }, + "build123d.geometry.Matrix.multiply": { + "name": "multiply", + "owner": "build123d.geometry.Matrix", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2715, + "signature": "(self, other)" + }, + "build123d.geometry.Matrix.rotate": { + "name": "rotate", + "owner": "build123d.geometry.Matrix", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2697, + "signature": "(self, axis: 'Axis', angle: 'float')" + }, + "build123d.geometry.Matrix.transposed_list": { + "name": "transposed_list", + "owner": "build123d.geometry.Matrix", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2722, + "signature": "(self) -> 'Sequence[float]'" + }, + "build123d.topology.three_d.Solid.draft": { + "name": "draft", + "owner": "build123d.topology.three_d.Solid", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 1794, + "signature": "(self, faces: 'Iterable[Face]', neutral_plane: 'Plane', angle: 'float') -> 'Solid'" + }, + "build123d.topology.three_d.Solid.extrude": { + "name": "extrude", + "owner": "build123d.topology.three_d.Solid", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1016, + "signature": "(cls, obj: 'Face', direction: 'VectorLike') -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "03_prismatic_solid", + "04_lines_and_arcs_profile", + "05_offset_cutouts", + "06_point_list_holes", + "07_polygon_holes", + "08_i_beam", + "11_grid_polygon_holes", + "12_spline_profile", + "15_mirrored_profile", + "16_mirrored_3d_parts", + "17_face_mirror", + "18_face_cutout", + "19_vertex_cutouts", + "20_offset_plane_cylinder", + "21_crossed_cylinders", + "22_angled_drill_holes", + "25_offset_polygon_layers", + "27_split_plate", + "28_face_located_sphere_holes", + "29_occ_bottle", + "30_bezier_profile", + "31_nested_location_pattern", + "32_variable_height_pattern", + "33_function_generated_pattern", + "34_embossed_debossed_text", + "35_curved_slots", + "37_positioned_sketches", + "41_pillow_block", + "42_din_rail", + "43_lego", + "45_key_cap", + "48_circuit_board" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.extrude_linear_with_rotation": { + "name": "extrude_linear_with_rotation", + "owner": "build123d.topology.three_d.Solid", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 1034, + "signature": "(cls, section: 'Face | Wire', center: 'VectorLike', normal: 'VectorLike', angle: 'float', inner_wires: 'list[Wire] | None' = None) -> 'Solid'" + }, + "build123d.topology.three_d.Solid.extrude_taper": { + "name": "extrude_taper", + "owner": "build123d.topology.three_d.Solid", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1128, + "signature": "(cls, profile: 'Face', direction: 'VectorLike', taper: 'float', flip_inner: 'bool' = True) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "45_key_cap" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.extrude_until": { + "name": "extrude_until", + "owner": "build123d.topology.three_d.Solid", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1202, + "signature": "(cls, profile: 'Face', target: 'Compound | Solid', direction: 'VectorLike', until: 'Until' = ) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "36_extrude_until", + "45_key_cap" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.from_bounding_box": { + "name": "from_bounding_box", + "owner": "build123d.topology.three_d.Solid", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 1312, + "signature": "(cls, bbox: 'BoundBox | OrientedBoundBox') -> 'Solid'" + }, + "build123d.topology.three_d.Solid.make_box": { + "name": "make_box", + "owner": "build123d.topology.three_d.Solid", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1320, + "signature": "(cls, length: 'float', width: 'float', height: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1))) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "01_rectangular_plate", + "02_plate_with_hole", + "09_fillets_and_chamfers", + "10_filleted_hole", + "11_grid_polygon_holes", + "18_face_cutout", + "20_offset_plane_cylinder", + "22_angled_drill_holes", + "24_circle_rectangle_loft", + "26_thin_wall_box", + "27_split_plate", + "34_embossed_debossed_text", + "35_curved_slots", + "38_rotated_boxes", + "43_lego" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.make_cone": { + "name": "make_cone", + "owner": "build123d.topology.three_d.Solid", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1348, + "signature": "(cls, base_radius: 'float', top_radius: 'float', height: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)), angle: 'float' = 360) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "13_countersink_counterbore", + "49_holes" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.make_cylinder": { + "name": "make_cylinder", + "owner": "build123d.topology.three_d.Solid", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1383, + "signature": "(cls, radius: 'float', height: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)), angle: 'float' = 360) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "02_plate_with_hole", + "10_filleted_hole", + "11_grid_polygon_holes", + "13_countersink_counterbore", + "28_face_located_sphere_holes", + "41_pillow_block", + "43_lego", + "49_holes" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.make_loft": { + "name": "make_loft", + "owner": "build123d.topology.three_d.Solid", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1415, + "signature": "(cls, objs: 'Iterable[Vertex | Wire]', ruled: 'bool' = False) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "24_circle_rectangle_loft", + "44_loft" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.make_sphere": { + "name": "make_sphere", + "owner": "build123d.topology.three_d.Solid", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1435, + "signature": "(cls, radius: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)), angle1: 'float' = -90, angle2: 'float' = 90, angle3: 'float' = 360) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "28_face_located_sphere_holes", + "45_key_cap" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.make_torus": { + "name": "make_torus", + "owner": "build123d.topology.three_d.Solid", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 1470, + "signature": "(cls, major_radius: 'float', minor_radius: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1)), start_angle: 'float' = 0, end_angle: 'float' = 360, major_angle: 'float' = 360) -> 'Solid'" + }, + "build123d.topology.three_d.Solid.make_wedge": { + "name": "make_wedge", + "owner": "build123d.topology.three_d.Solid", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 1507, + "signature": "(cls, delta_x: 'float', delta_y: 'float', delta_z: 'float', min_x: 'float', min_z: 'float', max_x: 'float', max_z: 'float', plane: 'Plane' = Plane((0, 0, 0), (1, 0, 0), (0, 0, 1))) -> 'Solid'" + }, + "build123d.topology.three_d.Solid.mass": { + "name": "mass", + "owner": "build123d.topology.three_d.Solid", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 774, + "signature": "(self, mass_unit: 'Unit' = , length_unit: 'Unit' = ) -> 'float'" + }, + "build123d.topology.three_d.Solid.revolve": { + "name": "revolve", + "owner": "build123d.topology.three_d.Solid", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1549, + "signature": "(cls, section: 'Face | Wire', angle: 'float', axis: 'Axis', inner_wires: 'list[Wire] | None' = None) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "23_revolved_profile", + "36_extrude_until", + "47_vase" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.sweep": { + "name": "sweep", + "owner": "build123d.topology.three_d.Solid", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1586, + "signature": "(cls, section: 'Face | Wire', path: 'Wire | Edge', inner_wires: 'list[Wire] | None' = None, make_solid: 'bool' = True, is_frenet: 'bool' = False, mode: 'Vector | Wire | Edge | None' = None, transition: 'Transition' = ) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "14_swept_square_tube", + "39_pegboard_j_hook", + "50_spring" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.sweep_multi": { + "name": "sweep_multi", + "owner": "build123d.topology.three_d.Solid", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "verified_sampled_usage", + "source_file": "build123d/topology/three_d.py", + "source_line": 1668, + "signature": "(cls, profiles: 'Iterable[Wire | Face]', path: 'Wire | Edge', make_solid: 'bool' = True, is_frenet: 'bool' = False, binormal: 'Vector | Wire | Edge | None' = None) -> 'Solid'", + "validation_evidence": { + "accepted_models": [ + "40_handle" + ], + "scope": "Captured member call in accepted models; other argument variants remain unverified." + } + }, + "build123d.topology.three_d.Solid.thicken": { + "name": "thicken", + "owner": "build123d.topology.three_d.Solid", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 1734, + "signature": "(cls, surface: 'Face | Shell', depth: 'float', normal_override: 'VectorLike | None' = None) -> 'Solid'" + }, + "build123d.topology.three_d.Solid.touch": { + "name": "touch", + "owner": "build123d.topology.three_d.Solid", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 780, + "signature": "(self, other: 'Shape', tolerance: 'float' = 1e-06, found_solids: 'ShapeList | None' = None) -> 'ShapeList[Vertex | Edge | Face]'" + }, + "build123d.topology.three_d.Solid.volume": { + "name": "volume", + "owner": "build123d.topology.three_d.Solid", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/three_d.py", + "source_line": 767, + "signature": "(self) -> 'float'" + }, + "build123d.topology.two_d.Shell.center": { + "name": "center", + "owner": "build123d.topology.two_d.Shell", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 3015, + "signature": "(self) -> 'Vector'" + }, + "build123d.topology.two_d.Shell.extrude": { + "name": "extrude", + "owner": "build123d.topology.two_d.Shell", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2917, + "signature": "(cls, obj: 'Wire', direction: 'VectorLike') -> 'Shell'" + }, + "build123d.topology.two_d.Shell.location_at": { + "name": "location_at", + "owner": "build123d.topology.two_d.Shell", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 3021, + "signature": "(self, surface_point: 'VectorLike', *, x_dir: 'VectorLike | None' = None) -> 'Location'" + }, + "build123d.topology.two_d.Shell.make_loft": { + "name": "make_loft", + "owner": "build123d.topology.two_d.Shell", + "category": "factory", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2935, + "signature": "(cls, objs: 'Iterable[Vertex | Wire]', ruled: 'bool' = False) -> 'Shell'" + }, + "build123d.topology.two_d.Shell.mass": { + "name": "mass", + "owner": "build123d.topology.two_d.Shell", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2911, + "signature": "(self, mass_unit: 'Unit' = , length_unit: 'Unit' = ) -> 'float'" + }, + "build123d.topology.two_d.Shell.revolve": { + "name": "revolve", + "owner": "build123d.topology.two_d.Shell", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2955, + "signature": "(cls, profile: 'Curve | Wire', angle: 'float', axis: 'Axis') -> 'Face'" + }, + "build123d.topology.two_d.Shell.sweep": { + "name": "sweep", + "owner": "build123d.topology.two_d.Shell", + "category": "feature", + "descriptor": "classmethod", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2981, + "signature": "(cls, profile: 'Curve | Edge | Wire', path: 'Curve | Edge | Wire', transition=) -> 'Shell'" + }, + "build123d.topology.two_d.Shell.volume": { + "name": "volume", + "owner": "build123d.topology.two_d.Shell", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/two_d.py", + "source_line": 2899, + "signature": "(self) -> 'float'" + }, + "build123d.geometry.Plane.__and__": { + "name": "__and__", + "owner": "build123d.geometry.Plane", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3215, + "signature": "(self: 'Plane', other: 'Axis | Location | Plane | VectorLike | Shape')" + }, + "build123d.geometry.Plane.__mul__": { + "name": "__mul__", + "owner": "build123d.geometry.Plane", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3187, + "signature": "(self, other: 'Location | Plane | Iterable[Location | Plane]') -> 'Location | list[Location]'" + }, + "build123d.geometry.Plane.__neg__": { + "name": "__neg__", + "owner": "build123d.geometry.Plane", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3177, + "signature": "(self) -> 'Plane'" + }, + "build123d.geometry.Plane.__rmul__": { + "name": "__rmul__", + "owner": "build123d.geometry.Plane", + "category": "algebra_operator", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3210, + "signature": "(self, other: 'Location | Plane | Iterable[Location | Plane]') -> 'Plane | list[Plane]'" + }, + "build123d.geometry.Plane.contains": { + "name": "contains", + "owner": "build123d.geometry.Plane", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3511, + "signature": "(self, obj: 'VectorLike | Axis', tolerance: 'float' = 1e-06) -> 'bool'" + }, + "build123d.geometry.Plane.forward_transform": { + "name": "forward_transform", + "owner": "build123d.geometry.Plane", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3382, + "signature": "(self)" + }, + "build123d.geometry.Plane.from_local_coords": { + "name": "from_local_coords", + "owner": "build123d.geometry.Plane", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3489, + "signature": "(self, obj: 'tuple | Vector | Any | BoundBox')" + }, + "build123d.geometry.Plane.get_topods_face_normal": { + "name": "get_topods_face_normal", + "owner": "build123d.geometry.Plane", + "category": "query_or_utility", + "descriptor": "staticmethod", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 2905, + "signature": "(face: 'TopoDS_Face') -> 'Vector'" + }, + "build123d.geometry.Plane.intersect": { + "name": "intersect", + "owner": "build123d.geometry.Plane", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3590, + "signature": "(self, *args, **kwargs)" + }, + "build123d.geometry.Plane.location": { + "name": "location", + "owner": "build123d.geometry.Plane", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3400, + "signature": "(self) -> 'Location'" + }, + "build123d.geometry.Plane.location_between": { + "name": "location_between", + "owner": "build123d.geometry.Plane", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3502, + "signature": "(self, other: 'Plane') -> 'Location'" + }, + "build123d.geometry.Plane.move": { + "name": "move", + "owner": "build123d.geometry.Plane", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3370, + "signature": "(self, loc: 'Location | Plane') -> 'Plane'" + }, + "build123d.geometry.Plane.moved": { + "name": "moved", + "owner": "build123d.geometry.Plane", + "category": "transform", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3357, + "signature": "(self, loc: 'Location | Plane') -> 'Plane'" + }, + "build123d.geometry.Plane.offset": { + "name": "offset", + "owner": "build123d.geometry.Plane", + "category": "feature", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3149, + "signature": "(self, amount: 'float') -> 'Plane'" + }, + "build123d.geometry.Plane.origin": { + "name": "origin", + "owner": "build123d.geometry.Plane", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3244, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Plane.reverse": { + "name": "reverse", + "owner": "build123d.geometry.Plane", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3240, + "signature": "(self) -> 'Plane'" + }, + "build123d.geometry.Plane.reverse_transform": { + "name": "reverse_transform", + "owner": "build123d.geometry.Plane", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3391, + "signature": "(self)" + }, + "build123d.geometry.Plane.rotated": { + "name": "rotated", + "owner": "build123d.geometry.Plane", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3320, + "signature": "(self, rotation: 'VectorLike' = (0, 0, 0), ordering: 'Extrinsic | Intrinsic | None' = None) -> 'Plane'" + }, + "build123d.geometry.Plane.shift_origin": { + "name": "shift_origin", + "owner": "build123d.geometry.Plane", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3283, + "signature": "(self, locator: 'Axis | VectorLike | Vertex') -> 'Plane'" + }, + "build123d.geometry.Plane.to_gp_ax2": { + "name": "to_gp_ax2", + "owner": "build123d.geometry.Plane", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3409, + "signature": "(self) -> 'gp_Ax2'" + }, + "build123d.geometry.Plane.to_gp_ax3": { + "name": "to_gp_ax3", + "owner": "build123d.geometry.Plane", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3405, + "signature": "(self) -> 'gp_Ax3'" + }, + "build123d.geometry.Plane.to_local_coords": { + "name": "to_local_coords", + "owner": "build123d.geometry.Plane", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3476, + "signature": "(self, obj: 'VectorLike | Any | BoundBox')" + }, + "build123d.geometry.Plane.wrapped": { + "name": "wrapped", + "owner": "build123d.geometry.Plane", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3134, + "signature": "(self) -> 'gp_Pln'" + }, + "build123d.geometry.Plane.x_dir": { + "name": "x_dir", + "owner": "build123d.geometry.Plane", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3259, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Plane.y_dir": { + "name": "y_dir", + "owner": "build123d.geometry.Plane", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3271, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.Plane.z_dir": { + "name": "z_dir", + "owner": "build123d.geometry.Plane", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 3254, + "signature": "(self) -> 'Vector'" + }, + "build123d.geometry.GeomEncoder.default": { + "name": "default", + "owner": "build123d.geometry.GeomEncoder", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1714, + "signature": "(self, o)" + }, + "build123d.geometry.GeomEncoder.geometry_hook": { + "name": "geometry_hook", + "owner": "build123d.geometry.GeomEncoder", + "category": "query_or_utility", + "descriptor": "staticmethod", + "conversion_status": "unverified", + "source_file": "build123d/geometry.py", + "source_line": 1730, + "signature": "(json_dict)" + }, + "build123d.topology.shape_core.Joint.connect_to": { + "name": "connect_to", + "owner": "build123d.topology.shape_core.Joint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3986, + "signature": "(self, *args, **kwargs)" + }, + "build123d.topology.shape_core.Joint.location": { + "name": "location", + "owner": "build123d.topology.shape_core.Joint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3974, + "signature": "(self) -> 'Location'" + }, + "build123d.topology.shape_core.Joint.relative_to": { + "name": "relative_to", + "owner": "build123d.topology.shape_core.Joint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3990, + "signature": "(self, *args, **kwargs) -> 'Location'" + }, + "build123d.topology.shape_core.Joint.symbol": { + "name": "symbol", + "owner": "build123d.topology.shape_core.Joint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/topology/shape_core.py", + "source_line": 3979, + "signature": "(self) -> 'Compound'" + }, + "build123d.joints.RigidJoint.connect_to": { + "name": "connect_to", + "owner": "build123d.joints.RigidJoint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 130, + "signature": "(self, other: 'Joint', **kwargs)" + }, + "build123d.joints.RigidJoint.location": { + "name": "location", + "owner": "build123d.joints.RigidJoint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 68, + "signature": "(self) -> 'Location'" + }, + "build123d.joints.RigidJoint.relative_to": { + "name": "relative_to", + "owner": "build123d.joints.RigidJoint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 169, + "signature": "(self, other: 'Joint', **kwargs) -> 'Location'" + }, + "build123d.joints.RigidJoint.symbol": { + "name": "symbol", + "owner": "build123d.joints.RigidJoint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 73, + "signature": "(self) -> 'Compound'" + }, + "build123d.joints.RevoluteJoint.connect_to": { + "name": "connect_to", + "owner": "build123d.joints.RevoluteJoint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 291, + "signature": "(self, other: 'RigidJoint', *, angle: 'float | None' = None)" + }, + "build123d.joints.RevoluteJoint.location": { + "name": "location", + "owner": "build123d.joints.RevoluteJoint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 242, + "signature": "(self) -> 'Location'" + }, + "build123d.joints.RevoluteJoint.relative_to": { + "name": "relative_to", + "owner": "build123d.joints.RevoluteJoint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 304, + "signature": "(self, other: 'RigidJoint', *, angle: 'float | None' = None)" + }, + "build123d.joints.RevoluteJoint.symbol": { + "name": "symbol", + "owner": "build123d.joints.RevoluteJoint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 247, + "signature": "(self) -> 'Compound'" + }, + "build123d.joints.LinearJoint.connect_to": { + "name": "connect_to", + "owner": "build123d.joints.LinearJoint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 423, + "signature": "(self, other: 'Joint', **kwargs)" + }, + "build123d.joints.LinearJoint.location": { + "name": "location", + "owner": "build123d.joints.LinearJoint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 367, + "signature": "(self) -> 'Location'" + }, + "build123d.joints.LinearJoint.relative_to": { + "name": "relative_to", + "owner": "build123d.joints.LinearJoint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 452, + "signature": "(self, other, **kwargs)" + }, + "build123d.joints.LinearJoint.symbol": { + "name": "symbol", + "owner": "build123d.joints.LinearJoint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 372, + "signature": "(self) -> 'Compound'" + }, + "build123d.joints.CylindricalJoint.connect_to": { + "name": "connect_to", + "owner": "build123d.joints.CylindricalJoint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 601, + "signature": "(self, other: 'RigidJoint', *, position: 'float | None' = None, angle: 'float | None' = None)" + }, + "build123d.joints.CylindricalJoint.location": { + "name": "location", + "owner": "build123d.joints.CylindricalJoint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 547, + "signature": "(self) -> 'Location'" + }, + "build123d.joints.CylindricalJoint.relative_to": { + "name": "relative_to", + "owner": "build123d.joints.CylindricalJoint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 622, + "signature": "(self, other: 'RigidJoint', *, position: 'float | None' = None, angle: 'float | None' = None)" + }, + "build123d.joints.CylindricalJoint.symbol": { + "name": "symbol", + "owner": "build123d.joints.CylindricalJoint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 552, + "signature": "(self) -> 'Compound'" + }, + "build123d.joints.BallJoint.connect_to": { + "name": "connect_to", + "owner": "build123d.joints.BallJoint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 753, + "signature": "(self, other: 'RigidJoint', *, angles: 'RotationLike | None' = None)" + }, + "build123d.joints.BallJoint.location": { + "name": "location", + "owner": "build123d.joints.BallJoint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 695, + "signature": "(self) -> 'Location'" + }, + "build123d.joints.BallJoint.relative_to": { + "name": "relative_to", + "owner": "build123d.joints.BallJoint", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 767, + "signature": "(self, other: 'RigidJoint', *, angles: 'RotationLike | None' = None)" + }, + "build123d.joints.BallJoint.symbol": { + "name": "symbol", + "owner": "build123d.joints.BallJoint", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/joints.py", + "source_line": 700, + "signature": "(self) -> 'Compound'" + }, + "build123d.text.FontManager.available_fonts": { + "name": "available_fonts", + "owner": "build123d.text.FontManager", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/text.py", + "source_line": 111, + "signature": "(self) -> list[build123d.text.FontInfo]" + }, + "build123d.text.FontManager.check_font": { + "name": "check_font", + "owner": "build123d.text.FontManager", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/text.py", + "source_line": 132, + "signature": "(self, path: str) -> OCP.OCP.Font.Font_SystemFont | None" + }, + "build123d.text.FontManager.find_font": { + "name": "find_font", + "owner": "build123d.text.FontManager", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/text.py", + "source_line": 136, + "signature": "(self, name: str, style: build123d.build_enums.FontStyle) -> OCP.OCP.Font.Font_SystemFont" + }, + "build123d.text.FontManager.register_folder": { + "name": "register_folder", + "owner": "build123d.text.FontManager", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/text.py", + "source_line": 173, + "signature": "(self, path: str, override: bool = False, single_stroke=False) -> list[str]" + }, + "build123d.text.FontManager.register_font": { + "name": "register_font", + "owner": "build123d.text.FontManager", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/text.py", + "source_line": 140, + "signature": "(self, path: str, override: bool = False, single_stroke=False) -> list[str]" + }, + "build123d.text.FontManager.register_system_fonts": { + "name": "register_system_fonts", + "owner": "build123d.text.FontManager", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/text.py", + "source_line": 187, + "signature": "(self)" + }, + "build123d.exporters.ExportDXF.add_layer": { + "name": "add_layer", + "owner": "build123d.exporters.ExportDXF", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 544, + "signature": "(self, name: str, *, color: build123d.exporters.ColorIndex | None = None, line_weight: float | None = None, line_type: build123d.exporters.LineType | None = None) -> Self" + }, + "build123d.exporters.ExportDXF.add_shape": { + "name": "add_shape", + "owner": "build123d.exporters.ExportDXF", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 607, + "signature": "(self, shape: build123d.topology.shape_core.Shape | collections.abc.Iterable[build123d.topology.shape_core.Shape], layer: str = '') -> Self" + }, + "build123d.exporters.ExportDXF.write": { + "name": "write", + "owner": "build123d.exporters.ExportDXF", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 643, + "signature": "(self, file_name: os.PathLike | str | bytes | _io.BytesIO, ascii_format: bool = True)" + }, + "build123d.exporters.ExportSVG.add_layer": { + "name": "add_layer", + "owner": "build123d.exporters.ExportSVG", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 1028, + "signature": "(self, name: str, *, fill_color: str | tuple[str, float | int] | tuple[float | int, float | int, float | int] | tuple[float | int, float | int, float | int, float | int] | int | tuple[int, int] | build123d.geometry.Color | OCP.OCP.Quantity.Quantity_ColorRGBA | build123d.exporters.ColorIndex | ezdxf.colors.RGB | None | typing_extensions.sentinel = INHERIT_COLOR, line_color: str | tuple[str, float | int] | tuple[float | int, float | int, float | int] | tuple[float | int, float | int, float | int, float | int] | int | tuple[int, int] | build123d.geometry.Color | OCP.OCP.Quantity.Quantity_ColorRGBA | build123d.exporters.ColorIndex | ezdxf.colors.RGB | None | typing_extensions.sentinel = INHERIT_COLOR, line_weight: float = 0.09, line_type: build123d.exporters.LineType = ) -> Self" + }, + "build123d.exporters.ExportSVG.add_shape": { + "name": "add_shape", + "owner": "build123d.exporters.ExportSVG", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 1077, + "signature": "(self, shape: build123d.topology.shape_core.Shape | collections.abc.Iterable[build123d.topology.shape_core.Shape], layer: str = '', reverse_wires: bool = False)" + }, + "build123d.exporters.ExportSVG.write": { + "name": "write", + "owner": "build123d.exporters.ExportSVG", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/exporters.py", + "source_line": 1554, + "signature": "(self, path: os.PathLike | str | bytes | _io.BytesIO)" + }, + "build123d.mesher.Mesher.add_code_to_metadata": { + "name": "add_code_to_metadata", + "owner": "build123d.mesher.Mesher", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 217, + "signature": "(self)" + }, + "build123d.mesher.Mesher.add_meta_data": { + "name": "add_meta_data", + "owner": "build123d.mesher.Mesher", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 188, + "signature": "(self, name_space: str, name: str, value: str, metadata_type: str, must_preserve: bool)" + }, + "build123d.mesher.Mesher.add_shape": { + "name": "add_shape", + "owner": "build123d.mesher.Mesher", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 369, + "signature": "(self, shape: build123d.topology.shape_core.Shape | collections.abc.Iterable[build123d.topology.shape_core.Shape], linear_deflection: float = 0.001, angular_deflection: float = 0.1, mesh_type: build123d.build_enums.MeshType = , part_number: str | None = None, uuid_value: uuid.UUID | None = None)" + }, + "build123d.mesher.Mesher.get_mesh_properties": { + "name": "get_mesh_properties", + "owner": "build123d.mesher.Mesher", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 256, + "signature": "(self) -> list[dict]" + }, + "build123d.mesher.Mesher.get_meta_data": { + "name": "get_meta_data", + "owner": "build123d.mesher.Mesher", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 233, + "signature": "(self) -> list[dict]" + }, + "build123d.mesher.Mesher.get_meta_data_by_key": { + "name": "get_meta_data_by_key", + "owner": "build123d.mesher.Mesher", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 247, + "signature": "(self, name_space: str, name: str) -> dict" + }, + "build123d.mesher.Mesher.library_version": { + "name": "library_version", + "owner": "build123d.mesher.Mesher", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 182, + "signature": "(self) -> str" + }, + "build123d.mesher.Mesher.mesh_count": { + "name": "mesh_count", + "owner": "build123d.mesher.Mesher", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 176, + "signature": "(self) -> int" + }, + "build123d.mesher.Mesher.model_unit": { + "name": "model_unit", + "owner": "build123d.mesher.Mesher", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 161, + "signature": "(self) -> build123d.build_enums.Unit" + }, + "build123d.mesher.Mesher.read": { + "name": "read", + "owner": "build123d.mesher.Mesher", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 516, + "signature": "(self, file_name: os.PathLike | str | bytes) -> list[build123d.topology.shape_core.Shape]" + }, + "build123d.mesher.Mesher.triangle_counts": { + "name": "triangle_counts", + "owner": "build123d.mesher.Mesher", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 166, + "signature": "(self) -> list[int]" + }, + "build123d.mesher.Mesher.vertex_counts": { + "name": "vertex_counts", + "owner": "build123d.mesher.Mesher", + "category": "property", + "descriptor": "property", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 171, + "signature": "(self) -> list[int]" + }, + "build123d.mesher.Mesher.write": { + "name": "write", + "owner": "build123d.mesher.Mesher", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 560, + "signature": "(self, file_name: os.PathLike | str | bytes)" + }, + "build123d.mesher.Mesher.write_stream": { + "name": "write_stream", + "owner": "build123d.mesher.Mesher", + "category": "query_or_utility", + "descriptor": "method", + "conversion_status": "unverified", + "source_file": "build123d/mesher.py", + "source_line": 576, + "signature": "(self, stream: _io.BytesIO, file_type: Literal['3mf', 'stl'])" + } + }, + "class_members": { + "build123d.topology.shape_core.Shape": [ + "build123d.topology.shape_core.Shape.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.shape_core.Shape.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.topology.one_d.Mixin1D": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Mixin1D.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.topology.two_d.Mixin2D": [ + "build123d.topology.shape_core.Shape.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.two_d.Mixin2D.__neg__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.two_d.Mixin2D.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.two_d.Mixin2D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.two_d.Mixin2D.location_at", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.two_d.Mixin2D.offset", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.two_d.Mixin2D.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.two_d.Mixin2D.split_by_perimeter", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.two_d.Mixin2D.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.topology.three_d.Mixin3D": [ + "build123d.topology.shape_core.Shape.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.three_d.Mixin3D.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.three_d.Mixin3D.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.three_d.Mixin3D.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.build_common.Builder": [ + "build123d.build_common.Builder.__add__", + "build123d.build_common.Builder.__and__", + "build123d.build_common.Builder.__enter__", + "build123d.build_common.Builder.__exit__", + "build123d.build_common.Builder.__sub__", + "build123d.build_common.Builder.edge", + "build123d.build_common.Builder.edges", + "build123d.build_common.Builder.face", + "build123d.build_common.Builder.faces", + "build123d.build_common.Builder.label", + "build123d.build_common.Builder.lasts", + "build123d.build_common.Builder.max_dimension", + "build123d.build_common.Builder.new_edges", + "build123d.build_common.Builder.news", + "build123d.build_common.Builder.solid", + "build123d.build_common.Builder.solids", + "build123d.build_common.Builder.validate_inputs", + "build123d.build_common.Builder.vertex", + "build123d.build_common.Builder.vertices", + "build123d.build_common.Builder.wire", + "build123d.build_common.Builder.wires" + ], + "build123d.build_common.BaseObjectMeta": [ + "build123d.build_common.BaseObjectMeta.__call__" + ], + "build123d.build_enums.Align": [], + "build123d.build_enums.ApproxOption": [], + "build123d.build_enums.AngularDirection": [], + "build123d.build_enums.CenterOf": [], + "build123d.build_enums.ContinuityLevel": [], + "build123d.build_enums.Convexity": [], + "build123d.build_enums.Extrinsic": [], + "build123d.build_enums.FontStyle": [], + "build123d.build_enums.FrameMethod": [], + "build123d.build_enums.GeomType": [], + "build123d.build_enums.HeadType": [], + "build123d.build_enums.Intrinsic": [], + "build123d.build_enums.Keep": [], + "build123d.build_enums.Kind": [], + "build123d.build_enums.Sagitta": [], + "build123d.build_enums.LengthMode": [], + "build123d.build_enums.MeshType": [], + "build123d.build_enums.Mode": [], + "build123d.build_enums.NumberDisplay": [], + "build123d.build_enums.PageSize": [], + "build123d.build_enums.Tangency": [], + "build123d.build_enums.PositionMode": [], + "build123d.build_enums.PrecisionMode": [], + "build123d.build_enums.Select": [], + "build123d.build_enums.Side": [], + "build123d.build_enums.SortBy": [], + "build123d.build_enums.TextAlign": [], + "build123d.build_enums.Transition": [], + "build123d.build_enums.Unit": [], + "build123d.build_enums.Until": [], + "build123d.build_common.HexLocations": [ + "build123d.build_common.LocationList.__enter__", + "build123d.build_common.LocationList.__exit__", + "build123d.build_common.LocationList.locations" + ], + "build123d.build_common.PolarLocations": [ + "build123d.build_common.LocationList.__enter__", + "build123d.build_common.LocationList.__exit__", + "build123d.build_common.LocationList.locations" + ], + "build123d.build_common.Locations": [ + "build123d.build_common.LocationList.__enter__", + "build123d.build_common.LocationList.__exit__", + "build123d.build_common.LocationList.locations" + ], + "build123d.build_common.GridLocations": [ + "build123d.build_common.LocationList.__enter__", + "build123d.build_common.LocationList.__exit__", + "build123d.build_common.LocationList.locations" + ], + "build123d.build_line.BuildLine": [ + "build123d.build_common.Builder.__add__", + "build123d.build_common.Builder.__and__", + "build123d.build_common.Builder.__enter__", + "build123d.build_common.Builder.__exit__", + "build123d.build_common.Builder.__sub__", + "build123d.build_common.Builder.edge", + "build123d.build_common.Builder.edges", + "build123d.build_line.BuildLine.face", + "build123d.build_line.BuildLine.faces", + "build123d.build_common.Builder.label", + "build123d.build_common.Builder.lasts", + "build123d.build_line.BuildLine.line", + "build123d.build_line.BuildLine.line_local", + "build123d.build_common.Builder.max_dimension", + "build123d.build_common.Builder.new_edges", + "build123d.build_common.Builder.news", + "build123d.build_line.BuildLine.solid", + "build123d.build_line.BuildLine.solids", + "build123d.build_common.Builder.validate_inputs", + "build123d.build_common.Builder.vertex", + "build123d.build_common.Builder.vertices", + "build123d.build_common.Builder.wire", + "build123d.build_common.Builder.wires" + ], + "build123d.build_part.BuildPart": [ + "build123d.build_common.Builder.__add__", + "build123d.build_common.Builder.__and__", + "build123d.build_common.Builder.__enter__", + "build123d.build_common.Builder.__exit__", + "build123d.build_common.Builder.__sub__", + "build123d.build_common.Builder.edge", + "build123d.build_common.Builder.edges", + "build123d.build_common.Builder.face", + "build123d.build_common.Builder.faces", + "build123d.build_common.Builder.label", + "build123d.build_common.Builder.lasts", + "build123d.build_part.BuildPart.location", + "build123d.build_common.Builder.max_dimension", + "build123d.build_common.Builder.new_edges", + "build123d.build_common.Builder.news", + "build123d.build_part.BuildPart.part", + "build123d.build_part.BuildPart.part_local", + "build123d.build_part.BuildPart.pending_edges_as_wire", + "build123d.build_common.Builder.solid", + "build123d.build_common.Builder.solids", + "build123d.build_common.Builder.validate_inputs", + "build123d.build_common.Builder.vertex", + "build123d.build_common.Builder.vertices", + "build123d.build_common.Builder.wire", + "build123d.build_common.Builder.wires" + ], + "build123d.build_sketch.BuildSketch": [ + "build123d.build_common.Builder.__add__", + "build123d.build_common.Builder.__and__", + "build123d.build_common.Builder.__enter__", + "build123d.build_common.Builder.__exit__", + "build123d.build_common.Builder.__sub__", + "build123d.build_sketch.BuildSketch.consolidate_edges", + "build123d.build_common.Builder.edge", + "build123d.build_common.Builder.edges", + "build123d.build_common.Builder.face", + "build123d.build_common.Builder.faces", + "build123d.build_common.Builder.label", + "build123d.build_common.Builder.lasts", + "build123d.build_common.Builder.max_dimension", + "build123d.build_common.Builder.new_edges", + "build123d.build_common.Builder.news", + "build123d.build_sketch.BuildSketch.sketch", + "build123d.build_sketch.BuildSketch.sketch_local", + "build123d.build_sketch.BuildSketch.solid", + "build123d.build_sketch.BuildSketch.solids", + "build123d.build_common.Builder.validate_inputs", + "build123d.build_common.Builder.vertex", + "build123d.build_common.Builder.vertices", + "build123d.build_common.Builder.wire", + "build123d.build_common.Builder.wires" + ], + "build123d.objects_curve.BaseCurveObject": [ + "build123d.topology.composite.Curve.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.composite.Curve.__matmul__", + "build123d.topology.composite.Curve.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.composite.Curve.__xor__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.composite.Curve.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.BaseEdgeObject": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.BaseLineObject": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.one_d.Wire.chamfer_2d", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Wire.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.one_d.Wire.combine", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.one_d.Wire.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Wire.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Wire.fillet_2d", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.one_d.Wire.fix_degenerate_edges", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Wire.geom_adaptor", + "build123d.topology.one_d.Wire.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Wire.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Wire.make_convex_hull", + "build123d.topology.one_d.Wire.make_ellipse", + "build123d.topology.one_d.Wire.make_polygon", + "build123d.topology.one_d.Wire.make_rect", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.one_d.Wire.order_chamfer_edges", + "build123d.topology.one_d.Wire.order_edges", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Wire.param_at", + "build123d.topology.one_d.Wire.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Wire.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Wire.stitch", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Wire.trim", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.Airfoil": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.objects_curve.Airfoil.camber_line", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.one_d.Wire.chamfer_2d", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Wire.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.one_d.Wire.combine", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.one_d.Wire.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Wire.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Wire.fillet_2d", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.one_d.Wire.fix_degenerate_edges", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Wire.geom_adaptor", + "build123d.topology.one_d.Wire.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Wire.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Wire.make_convex_hull", + "build123d.topology.one_d.Wire.make_ellipse", + "build123d.topology.one_d.Wire.make_polygon", + "build123d.topology.one_d.Wire.make_rect", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.one_d.Wire.order_chamfer_edges", + "build123d.topology.one_d.Wire.order_edges", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Wire.param_at", + "build123d.topology.one_d.Wire.param_at_point", + "build123d.objects_curve.Airfoil.parse_naca4", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Wire.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Wire.stitch", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Wire.trim", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.Bezier": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.BlendCurve": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.BSpline": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.CenterArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.ConstrainedArcs": [ + "build123d.topology.composite.Curve.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.composite.Curve.__matmul__", + "build123d.topology.composite.Curve.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.composite.Curve.__xor__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.composite.Curve.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.ConstrainedLines": [ + "build123d.topology.composite.Curve.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.composite.Curve.__matmul__", + "build123d.topology.composite.Curve.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.composite.Curve.__xor__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.composite.Curve.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.DoubleTangentArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.EllipticalCenterArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.EllipticalStartArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.ParabolicCenterArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.HyperbolicCenterArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.FilletPolyline": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.one_d.Wire.chamfer_2d", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Wire.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.one_d.Wire.combine", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.one_d.Wire.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Wire.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Wire.fillet_2d", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.one_d.Wire.fix_degenerate_edges", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Wire.geom_adaptor", + "build123d.topology.one_d.Wire.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Wire.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Wire.make_convex_hull", + "build123d.topology.one_d.Wire.make_ellipse", + "build123d.topology.one_d.Wire.make_polygon", + "build123d.topology.one_d.Wire.make_rect", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.one_d.Wire.order_chamfer_edges", + "build123d.topology.one_d.Wire.order_edges", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Wire.param_at", + "build123d.topology.one_d.Wire.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Wire.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Wire.stitch", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Wire.trim", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.Helix": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.IntersectingLine": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.Line": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.PolarLine": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.Polyline": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.one_d.Wire.chamfer_2d", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Wire.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.one_d.Wire.combine", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.one_d.Wire.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Wire.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Wire.fillet_2d", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.one_d.Wire.fix_degenerate_edges", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Wire.geom_adaptor", + "build123d.topology.one_d.Wire.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Wire.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Wire.make_convex_hull", + "build123d.topology.one_d.Wire.make_ellipse", + "build123d.topology.one_d.Wire.make_polygon", + "build123d.topology.one_d.Wire.make_rect", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.one_d.Wire.order_chamfer_edges", + "build123d.topology.one_d.Wire.order_edges", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Wire.param_at", + "build123d.topology.one_d.Wire.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Wire.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Wire.stitch", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Wire.trim", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.RadiusArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.SagittaArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.Spline": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.TangentArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.JernArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_curve.ThreePointArc": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.drafting.ArrowHead": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.drafting.Arrow": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.BaseSketchObject": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.Circle": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.drafting.Draft": [ + "build123d.drafting.Draft.is_metric" + ], + "build123d.drafting.DimensionLine": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.Ellipse": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.drafting.ExtensionLine": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.Polygon": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.Rectangle": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.RectangleRounded": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.RegularPolygon": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.SlotArc": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.SlotCenterPoint": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.SlotCenterToCenter": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.SlotOverall": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.Superellipse": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.Text": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.drafting.TechnicalDrawing": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.Trapezoid": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_sketch.Triangle": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.BasePartObject": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.Box": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.Cone": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.ConvexPolyhedron": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.CounterBoreHole": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.CounterSinkHole": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.Cylinder": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.Hole": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.Sphere": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.Torus": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.objects_part.Wedge": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.geometry.BoundBox": [ + "build123d.geometry.BoundBox.add", + "build123d.geometry.BoundBox.center", + "build123d.geometry.BoundBox.contains", + "build123d.geometry.BoundBox.contains_properly", + "build123d.geometry.BoundBox.covered_by", + "build123d.geometry.BoundBox.covers", + "build123d.geometry.BoundBox.diagonal", + "build123d.geometry.BoundBox.disjoint", + "build123d.geometry.BoundBox.find_outside_box_2d", + "build123d.geometry.BoundBox.from_topo_ds", + "build123d.geometry.BoundBox.intersects", + "build123d.geometry.BoundBox.is_inside", + "build123d.geometry.BoundBox.measure", + "build123d.geometry.BoundBox.overlaps", + "build123d.geometry.BoundBox.to_align_offset", + "build123d.geometry.BoundBox.touches", + "build123d.geometry.BoundBox.within" + ], + "build123d.geometry.OrientedBoundBox": [ + "build123d.geometry.OrientedBoundBox.center", + "build123d.geometry.OrientedBoundBox.corners", + "build123d.geometry.OrientedBoundBox.diagonal", + "build123d.geometry.OrientedBoundBox.is_completely_inside", + "build123d.geometry.OrientedBoundBox.is_outside", + "build123d.geometry.OrientedBoundBox.location", + "build123d.geometry.OrientedBoundBox.plane", + "build123d.geometry.OrientedBoundBox.size", + "build123d.geometry.OrientedBoundBox.wrapped", + "build123d.geometry.OrientedBoundBox.x_direction", + "build123d.geometry.OrientedBoundBox.y_direction", + "build123d.geometry.OrientedBoundBox.z_direction" + ], + "build123d.geometry.Rotation": [ + "build123d.geometry.Location.__and__", + "build123d.geometry.Location.__mul__", + "build123d.geometry.Location.__neg__", + "build123d.geometry.Location.center", + "build123d.geometry.Location.intersect", + "build123d.geometry.Location.inverse", + "build123d.geometry.Location.mirror", + "build123d.geometry.Location.orientation", + "build123d.geometry.Location.position", + "build123d.geometry.Location.wrapped", + "build123d.geometry.Location.x_axis", + "build123d.geometry.Location.y_axis", + "build123d.geometry.Location.z_axis" + ], + "build123d.geometry.Pos": [ + "build123d.geometry.Location.__and__", + "build123d.geometry.Location.__mul__", + "build123d.geometry.Location.__neg__", + "build123d.geometry.Location.center", + "build123d.geometry.Location.intersect", + "build123d.geometry.Location.inverse", + "build123d.geometry.Location.mirror", + "build123d.geometry.Location.orientation", + "build123d.geometry.Location.position", + "build123d.geometry.Location.wrapped", + "build123d.geometry.Location.x_axis", + "build123d.geometry.Location.y_axis", + "build123d.geometry.Location.z_axis" + ], + "build123d.topology.shape_core.ShapeList": [ + "build123d.topology.shape_core.ShapeList.__add__", + "build123d.topology.shape_core.ShapeList.__and__", + "build123d.topology.shape_core.ShapeList.__sub__", + "build123d.topology.shape_core.ShapeList.center", + "build123d.topology.shape_core.ShapeList.compound", + "build123d.topology.shape_core.ShapeList.compounds", + "build123d.topology.shape_core.ShapeList.edge", + "build123d.topology.shape_core.ShapeList.edges", + "build123d.topology.shape_core.ShapeList.expand", + "build123d.topology.shape_core.ShapeList.face", + "build123d.topology.shape_core.ShapeList.faces", + "build123d.topology.shape_core.ShapeList.filter_by", + "build123d.topology.shape_core.ShapeList.filter_by_position", + "build123d.topology.shape_core.ShapeList.first", + "build123d.topology.shape_core.ShapeList.group_by", + "build123d.topology.shape_core.ShapeList.last", + "build123d.topology.shape_core.ShapeList.shell", + "build123d.topology.shape_core.ShapeList.shells", + "build123d.topology.shape_core.ShapeList.solid", + "build123d.topology.shape_core.ShapeList.solids", + "build123d.topology.shape_core.ShapeList.sort_by", + "build123d.topology.shape_core.ShapeList.sort_by_distance", + "build123d.topology.shape_core.ShapeList.vertex", + "build123d.topology.shape_core.ShapeList.vertices", + "build123d.topology.shape_core.ShapeList.wire", + "build123d.topology.shape_core.ShapeList.wires" + ], + "build123d.geometry.Axis": [ + "build123d.geometry.Axis.__and__", + "build123d.geometry.Axis.__neg__", + "build123d.geometry.Axis.angle_between", + "build123d.geometry.Axis.direction", + "build123d.geometry.Axis.intersect", + "build123d.geometry.Axis.is_coaxial", + "build123d.geometry.Axis.is_normal", + "build123d.geometry.Axis.is_opposite", + "build123d.geometry.Axis.is_parallel", + "build123d.geometry.Axis.is_skew", + "build123d.geometry.Axis.located", + "build123d.geometry.Axis.location", + "build123d.geometry.Axis.position", + "build123d.geometry.Axis.reverse", + "build123d.geometry.Axis.wrapped" + ], + "build123d.geometry.Color": [ + "build123d.geometry.Color.categorical_set" + ], + "build123d.topology.composite.Curve": [ + "build123d.topology.composite.Curve.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.composite.Curve.__matmul__", + "build123d.topology.composite.Curve.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.composite.Curve.__xor__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.composite.Curve.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.geometry.Vector": [ + "build123d.geometry.Vector.X", + "build123d.geometry.Vector.Y", + "build123d.geometry.Vector.Z", + "build123d.geometry.Vector.__add__", + "build123d.geometry.Vector.__and__", + "build123d.geometry.Vector.__mul__", + "build123d.geometry.Vector.__neg__", + "build123d.geometry.Vector.__radd__", + "build123d.geometry.Vector.__rmul__", + "build123d.geometry.Vector.__sub__", + "build123d.geometry.Vector.add", + "build123d.geometry.Vector.center", + "build123d.geometry.Vector.cross", + "build123d.geometry.Vector.distance_to_plane", + "build123d.geometry.Vector.dot", + "build123d.geometry.Vector.get_angle", + "build123d.geometry.Vector.get_signed_angle", + "build123d.geometry.Vector.intersect", + "build123d.geometry.Vector.length", + "build123d.geometry.Vector.multiply", + "build123d.geometry.Vector.normalized", + "build123d.geometry.Vector.project_to_line", + "build123d.geometry.Vector.project_to_plane", + "build123d.geometry.Vector.reverse", + "build123d.geometry.Vector.rotate", + "build123d.geometry.Vector.signed_distance_from_plane", + "build123d.geometry.Vector.sub", + "build123d.geometry.Vector.to_dir", + "build123d.geometry.Vector.to_pnt", + "build123d.geometry.Vector.transform", + "build123d.geometry.Vector.wrapped" + ], + "build123d.topology.zero_d.Vertex": [ + "build123d.topology.zero_d.Vertex.X", + "build123d.topology.zero_d.Vertex.Y", + "build123d.topology.zero_d.Vertex.Z", + "build123d.topology.zero_d.Vertex.__add__", + "build123d.topology.zero_d.Vertex.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.zero_d.Vertex.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.zero_d.Vertex.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.zero_d.Vertex.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.zero_d.Vertex.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.zero_d.Vertex.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.zero_d.Vertex.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.zero_d.Vertex.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.zero_d.Vertex.vertex", + "build123d.topology.zero_d.Vertex.vertices", + "build123d.topology.zero_d.Vertex.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.topology.one_d.Edge": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.one_d.Edge.arc_center", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Edge.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.one_d.Edge.distribute_locations", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Edge.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Edge.find_intersection_points", + "build123d.topology.one_d.Edge.find_tangent", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Edge.geom_adaptor", + "build123d.topology.one_d.Edge.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Edge.is_infinite", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Edge.make_bezier", + "build123d.topology.one_d.Edge.make_bspline", + "build123d.topology.one_d.Edge.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Edge.make_constrained_arcs", + "build123d.topology.one_d.Edge.make_constrained_lines", + "build123d.topology.one_d.Edge.make_ellipse", + "build123d.topology.one_d.Edge.make_helix", + "build123d.topology.one_d.Edge.make_hyperbola", + "build123d.topology.one_d.Edge.make_line", + "build123d.topology.one_d.Edge.make_mid_way", + "build123d.topology.one_d.Edge.make_parabola", + "build123d.topology.one_d.Edge.make_spline", + "build123d.topology.one_d.Edge.make_spline_approx", + "build123d.topology.one_d.Edge.make_tangent_arc", + "build123d.topology.one_d.Edge.make_three_point_arc", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Edge.param_at", + "build123d.topology.one_d.Edge.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Edge.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.one_d.Edge.reversed", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Edge.trim", + "build123d.topology.one_d.Edge.trim_infinite", + "build123d.topology.one_d.Edge.trim_to_length", + "build123d.topology.one_d.Edge.trim_to_other", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.topology.one_d.Wire": [ + "build123d.topology.one_d.Mixin1D.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.one_d.Mixin1D.__matmul__", + "build123d.topology.one_d.Mixin1D.__mod__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.one_d.Mixin1D.__xor__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.one_d.Mixin1D.center", + "build123d.topology.one_d.Wire.chamfer_2d", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.one_d.Wire.close", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.one_d.Wire.combine", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.one_d.Mixin1D.common_plane", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.one_d.Mixin1D.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.one_d.Mixin1D.curvature_comb", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.one_d.Mixin1D.derivative_at", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.one_d.Wire.edges", + "build123d.topology.one_d.Mixin1D.end_point", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.one_d.Wire.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.one_d.Wire.fillet_2d", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.one_d.Wire.fix_degenerate_edges", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.one_d.Wire.geom_adaptor", + "build123d.topology.one_d.Wire.geom_equal", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.one_d.Mixin1D.is_closed", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.one_d.Mixin1D.is_forward", + "build123d.topology.one_d.Mixin1D.is_interior", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.one_d.Mixin1D.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.one_d.Mixin1D.location_at", + "build123d.topology.one_d.Mixin1D.locations", + "build123d.topology.one_d.Wire.make_circle", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.one_d.Wire.make_convex_hull", + "build123d.topology.one_d.Wire.make_ellipse", + "build123d.topology.one_d.Wire.make_polygon", + "build123d.topology.one_d.Wire.make_rect", + "build123d.topology.one_d.Mixin1D.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.one_d.Mixin1D.normal", + "build123d.topology.one_d.Mixin1D.offset_2d", + "build123d.topology.one_d.Wire.order_chamfer_edges", + "build123d.topology.one_d.Wire.order_edges", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.one_d.Wire.param_at", + "build123d.topology.one_d.Wire.param_at_point", + "build123d.topology.one_d.Mixin1D.perpendicular_line", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.one_d.Mixin1D.position_at", + "build123d.topology.one_d.Mixin1D.positions", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.one_d.Mixin1D.project", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.one_d.Wire.project_to_shape", + "build123d.topology.one_d.Mixin1D.project_to_viewport", + "build123d.topology.one_d.Mixin1D.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.one_d.Mixin1D.start_point", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.one_d.Wire.stitch", + "build123d.topology.one_d.Mixin1D.tangent_angle_at", + "build123d.topology.one_d.Mixin1D.tangent_at", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.shape_core.Shape.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.one_d.Wire.trim", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.one_d.Mixin1D.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.topology.two_d.Face": [ + "build123d.topology.shape_core.Shape.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.two_d.Mixin2D.__neg__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.two_d.Face.area_without_holes", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.two_d.Face.axes_of_symmetry", + "build123d.topology.two_d.Face.axis_of_rotation", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.two_d.Face.center", + "build123d.topology.two_d.Face.center_location", + "build123d.topology.two_d.Face.chamfer_2d", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.two_d.Face.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.two_d.Face.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.two_d.Face.fillet_2d", + "build123d.topology.two_d.Mixin2D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.two_d.Face.geom_adaptor", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.two_d.Face.geometry", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.two_d.Face.inner_wires", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.two_d.Face.is_circular_concave", + "build123d.topology.two_d.Face.is_circular_convex", + "build123d.topology.two_d.Face.is_coplanar", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.two_d.Face.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.two_d.Face.is_planar", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.two_d.Face.length", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.two_d.Face.location_at", + "build123d.topology.two_d.Face.make_bezier_surface", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.two_d.Face.make_gordon_surface", + "build123d.topology.two_d.Face.make_holes", + "build123d.topology.two_d.Face.make_rect", + "build123d.topology.two_d.Face.make_surface", + "build123d.topology.two_d.Face.make_surface_from_array_of_points", + "build123d.topology.two_d.Face.make_surface_from_curves", + "build123d.topology.two_d.Face.make_surface_patch", + "build123d.topology.two_d.Face.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.two_d.Face.normal_at", + "build123d.topology.two_d.Mixin2D.offset", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.two_d.Face.outer_wire", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.two_d.Face.position_at", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.two_d.Face.project_to_shape", + "build123d.topology.two_d.Mixin2D.project_to_viewport", + "build123d.topology.two_d.Face.radii", + "build123d.topology.two_d.Face.radius", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.two_d.Face.revolve", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.two_d.Face.seams", + "build123d.topology.two_d.Face.semi_angle", + "build123d.topology.two_d.Face.sew_faces", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.two_d.Mixin2D.split_by_perimeter", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.two_d.Face.sweep", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.two_d.Mixin2D.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.two_d.Face.uv_face", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.two_d.Face.volume", + "build123d.topology.two_d.Face.width", + "build123d.topology.two_d.Face.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.two_d.Face.without_holes", + "build123d.topology.two_d.Face.wrap", + "build123d.topology.two_d.Face.wrap_faces", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.geometry.Matrix": [ + "build123d.geometry.Matrix.inverse", + "build123d.geometry.Matrix.multiply", + "build123d.geometry.Matrix.rotate", + "build123d.geometry.Matrix.transposed_list" + ], + "build123d.topology.three_d.Solid": [ + "build123d.topology.shape_core.Shape.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.three_d.Mixin3D.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.three_d.Solid.draft", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.three_d.Solid.extrude", + "build123d.topology.three_d.Solid.extrude_linear_with_rotation", + "build123d.topology.three_d.Solid.extrude_taper", + "build123d.topology.three_d.Solid.extrude_until", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.three_d.Solid.from_bounding_box", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.three_d.Solid.make_box", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.three_d.Solid.make_cone", + "build123d.topology.three_d.Solid.make_cylinder", + "build123d.topology.three_d.Solid.make_loft", + "build123d.topology.three_d.Solid.make_sphere", + "build123d.topology.three_d.Solid.make_torus", + "build123d.topology.three_d.Solid.make_wedge", + "build123d.topology.three_d.Solid.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.three_d.Mixin3D.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.three_d.Solid.revolve", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.three_d.Solid.sweep", + "build123d.topology.three_d.Solid.sweep_multi", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.three_d.Solid.thicken", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.three_d.Solid.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.three_d.Solid.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.topology.two_d.Shell": [ + "build123d.topology.shape_core.Shape.__add__", + "build123d.topology.shape_core.Shape.__and__", + "build123d.topology.two_d.Mixin2D.__neg__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.shape_core.Shape.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.two_d.Shell.center", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.shape_core.Shape.compound", + "build123d.topology.shape_core.Shape.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.two_d.Shell.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.two_d.Mixin2D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.two_d.Shell.location_at", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.two_d.Shell.make_loft", + "build123d.topology.two_d.Shell.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.two_d.Mixin2D.offset", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.two_d.Mixin2D.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.two_d.Shell.revolve", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.two_d.Mixin2D.split_by_perimeter", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.two_d.Shell.sweep", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.two_d.Mixin2D.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.two_d.Shell.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.topology.composite.Part": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.geometry.Plane": [ + "build123d.geometry.Plane.__and__", + "build123d.geometry.Plane.__mul__", + "build123d.geometry.Plane.__neg__", + "build123d.geometry.Plane.__rmul__", + "build123d.geometry.Plane.contains", + "build123d.geometry.Plane.forward_transform", + "build123d.geometry.Plane.from_local_coords", + "build123d.geometry.Plane.get_topods_face_normal", + "build123d.geometry.Plane.intersect", + "build123d.geometry.Plane.location", + "build123d.geometry.Plane.location_between", + "build123d.geometry.Plane.move", + "build123d.geometry.Plane.moved", + "build123d.geometry.Plane.offset", + "build123d.geometry.Plane.origin", + "build123d.geometry.Plane.reverse", + "build123d.geometry.Plane.reverse_transform", + "build123d.geometry.Plane.rotated", + "build123d.geometry.Plane.shift_origin", + "build123d.geometry.Plane.to_gp_ax2", + "build123d.geometry.Plane.to_gp_ax3", + "build123d.geometry.Plane.to_local_coords", + "build123d.geometry.Plane.wrapped", + "build123d.geometry.Plane.x_dir", + "build123d.geometry.Plane.y_dir", + "build123d.geometry.Plane.z_dir" + ], + "build123d.topology.composite.Compound": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.geometry.Location": [ + "build123d.geometry.Location.__and__", + "build123d.geometry.Location.__mul__", + "build123d.geometry.Location.__neg__", + "build123d.geometry.Location.center", + "build123d.geometry.Location.intersect", + "build123d.geometry.Location.inverse", + "build123d.geometry.Location.mirror", + "build123d.geometry.Location.orientation", + "build123d.geometry.Location.position", + "build123d.geometry.Location.wrapped", + "build123d.geometry.Location.x_axis", + "build123d.geometry.Location.y_axis", + "build123d.geometry.Location.z_axis" + ], + "build123d.geometry.GeomEncoder": [ + "build123d.geometry.GeomEncoder.default", + "build123d.geometry.GeomEncoder.geometry_hook" + ], + "build123d.topology.shape_core.Joint": [ + "build123d.topology.shape_core.Joint.connect_to", + "build123d.topology.shape_core.Joint.location", + "build123d.topology.shape_core.Joint.relative_to", + "build123d.topology.shape_core.Joint.symbol" + ], + "build123d.joints.RigidJoint": [ + "build123d.joints.RigidJoint.connect_to", + "build123d.joints.RigidJoint.location", + "build123d.joints.RigidJoint.relative_to", + "build123d.joints.RigidJoint.symbol" + ], + "build123d.joints.RevoluteJoint": [ + "build123d.joints.RevoluteJoint.connect_to", + "build123d.joints.RevoluteJoint.location", + "build123d.joints.RevoluteJoint.relative_to", + "build123d.joints.RevoluteJoint.symbol" + ], + "build123d.topology.composite.Sketch": [ + "build123d.topology.composite.Compound.__add__", + "build123d.topology.composite.Compound.__and__", + "build123d.topology.shape_core.Shape.__rmul__", + "build123d.topology.composite.Compound.__sub__", + "build123d.topology.shape_core.Shape.area", + "build123d.topology.shape_core.Shape.as_shape", + "build123d.topology.shape_core.Shape.bounding_box", + "build123d.topology.shape_core.Shape.cast", + "build123d.topology.composite.Compound.center", + "build123d.topology.three_d.Mixin3D.chamfer", + "build123d.topology.shape_core.Shape.clean", + "build123d.topology.shape_core.Shape.closest_points", + "build123d.topology.shape_core.Shape.color", + "build123d.topology.shape_core.Shape.combined_center", + "build123d.topology.composite.Compound.compound", + "build123d.topology.composite.Compound.compounds", + "build123d.topology.shape_core.Shape.compute_mass", + "build123d.topology.shape_core.Shape.compute_volume", + "build123d.topology.shape_core.Shape.convexity", + "build123d.topology.shape_core.Shape.copy_attributes_to", + "build123d.topology.shape_core.Shape.cut", + "build123d.topology.shape_core.Shape.distance", + "build123d.topology.shape_core.Shape.distance_to", + "build123d.topology.shape_core.Shape.distance_to_with_closest_points", + "build123d.topology.shape_core.Shape.distances", + "build123d.topology.composite.Compound.do_children_intersect", + "build123d.topology.three_d.Mixin3D.dprism", + "build123d.topology.shape_core.Shape.edge", + "build123d.topology.shape_core.Shape.edges", + "build123d.topology.shape_core.Shape.entities", + "build123d.topology.composite.Compound.extrude", + "build123d.topology.shape_core.Shape.face", + "build123d.topology.shape_core.Shape.faces", + "build123d.topology.shape_core.Shape.faces_intersected_by_axis", + "build123d.topology.three_d.Mixin3D.fillet", + "build123d.topology.three_d.Mixin3D.find_intersection_points", + "build123d.topology.shape_core.Shape.fix", + "build123d.topology.shape_core.Shape.fuse", + "build123d.topology.shape_core.Shape.geom_type", + "build123d.topology.shape_core.Shape.get_shape_list", + "build123d.topology.shape_core.Shape.get_single_shape", + "build123d.topology.shape_core.Shape.get_top_level_shapes", + "build123d.topology.composite.Compound.get_type", + "build123d.topology.shape_core.Shape.global_location", + "build123d.topology.three_d.Mixin3D.hollow", + "build123d.topology.shape_core.Shape.intersect", + "build123d.topology.shape_core.Shape.is_equal", + "build123d.topology.three_d.Mixin3D.is_inside", + "build123d.topology.shape_core.Shape.is_manifold", + "build123d.topology.shape_core.Shape.is_null", + "build123d.topology.shape_core.Shape.is_same", + "build123d.topology.shape_core.Shape.is_valid", + "build123d.topology.shape_core.Shape.locate", + "build123d.topology.shape_core.Shape.located", + "build123d.topology.shape_core.Shape.location", + "build123d.topology.shape_core.Shape.make_composite", + "build123d.topology.composite.Compound.make_text", + "build123d.topology.composite.Compound.make_triad", + "build123d.topology.composite.Compound.mass", + "build123d.topology.shape_core.Shape.material", + "build123d.topology.shape_core.Shape.matrix_of_inertia", + "build123d.topology.three_d.Mixin3D.max_fillet", + "build123d.topology.shape_core.Shape.mesh", + "build123d.topology.shape_core.Shape.mirror", + "build123d.topology.shape_core.Shape.move", + "build123d.topology.shape_core.Shape.moved", + "build123d.topology.three_d.Mixin3D.offset_3d", + "build123d.topology.shape_core.Shape.orientation", + "build123d.topology.shape_core.Shape.oriented_bounding_box", + "build123d.topology.shape_core.Shape.position", + "build123d.topology.shape_core.Shape.principal_properties", + "build123d.topology.shape_core.Shape.project_faces", + "build123d.topology.composite.Compound.project_to_viewport", + "build123d.topology.shape_core.Shape.radius_of_gyration", + "build123d.topology.shape_core.Shape.register_composite_factory", + "build123d.topology.shape_core.Shape.register_geometry_constructor", + "build123d.topology.shape_core.Shape.register_shape_constructor", + "build123d.topology.composite.Compound.resolve_font", + "build123d.topology.shape_core.Shape.rotate", + "build123d.topology.shape_core.Shape.scale", + "build123d.topology.shape_core.Shape.shape_type", + "build123d.topology.shape_core.Shape.shell", + "build123d.topology.shape_core.Shape.shells", + "build123d.topology.shape_core.Shape.show_topology", + "build123d.topology.shape_core.Shape.solid", + "build123d.topology.shape_core.Shape.solids", + "build123d.topology.shape_core.Shape.split", + "build123d.topology.shape_core.Shape.static_moments", + "build123d.topology.shape_core.Shape.tessellate", + "build123d.topology.shape_core.Shape.tessellate_with_uvs", + "build123d.topology.shape_core.Shape.to_splines", + "build123d.topology.shape_core.Shape.topo_owner", + "build123d.topology.shape_core.Shape.topo_parent", + "build123d.topology.composite.Compound.touch", + "build123d.topology.shape_core.Shape.transform_geometry", + "build123d.topology.shape_core.Shape.transform_shape", + "build123d.topology.shape_core.Shape.transformed", + "build123d.topology.shape_core.Shape.translate", + "build123d.topology.composite.Compound.unwrap", + "build123d.topology.shape_core.Shape.vertex", + "build123d.topology.shape_core.Shape.vertices", + "build123d.topology.composite.Compound.volume", + "build123d.topology.shape_core.Shape.wire", + "build123d.topology.shape_core.Shape.wires", + "build123d.topology.shape_core.Shape.wrapped" + ], + "build123d.joints.LinearJoint": [ + "build123d.joints.LinearJoint.connect_to", + "build123d.joints.LinearJoint.location", + "build123d.joints.LinearJoint.relative_to", + "build123d.joints.LinearJoint.symbol" + ], + "build123d.joints.CylindricalJoint": [ + "build123d.joints.CylindricalJoint.connect_to", + "build123d.joints.CylindricalJoint.location", + "build123d.joints.CylindricalJoint.relative_to", + "build123d.joints.CylindricalJoint.symbol" + ], + "build123d.joints.BallJoint": [ + "build123d.joints.BallJoint.connect_to", + "build123d.joints.BallJoint.location", + "build123d.joints.BallJoint.relative_to", + "build123d.joints.BallJoint.symbol" + ], + "build123d.topology.three_d.DraftAngleError": [], + "build123d.text.FontManager": [ + "build123d.text.FontManager.available_fonts", + "build123d.text.FontManager.check_font", + "build123d.text.FontManager.find_font", + "build123d.text.FontManager.register_folder", + "build123d.text.FontManager.register_font", + "build123d.text.FontManager.register_system_fonts" + ], + "build123d.exporters.Export2D": [], + "build123d.exporters.ExportDXF": [ + "build123d.exporters.ExportDXF.add_layer", + "build123d.exporters.ExportDXF.add_shape", + "build123d.exporters.ExportDXF.write" + ], + "build123d.exporters.ExportSVG": [ + "build123d.exporters.ExportSVG.add_layer", + "build123d.exporters.ExportSVG.add_shape", + "build123d.exporters.ExportSVG.write" + ], + "build123d.exporters.LineType": [], + "build123d.exporters.DotLength": [], + "build123d.mesher.Mesher": [ + "build123d.mesher.Mesher.add_code_to_metadata", + "build123d.mesher.Mesher.add_meta_data", + "build123d.mesher.Mesher.add_shape", + "build123d.mesher.Mesher.get_mesh_properties", + "build123d.mesher.Mesher.get_meta_data", + "build123d.mesher.Mesher.get_meta_data_by_key", + "build123d.mesher.Mesher.library_version", + "build123d.mesher.Mesher.mesh_count", + "build123d.mesher.Mesher.model_unit", + "build123d.mesher.Mesher.read", + "build123d.mesher.Mesher.triangle_counts", + "build123d.mesher.Mesher.vertex_counts", + "build123d.mesher.Mesher.write", + "build123d.mesher.Mesher.write_stream" + ] + }, + "corpus": { + "counting_note": "AST call sites, not runtime execution counts. Constant-false GEN_DOCS branches and __main__ export blocks are omitted; loops/functions are counted syntactically. Operator counts include numeric arithmetic.", + "top_level_calls": { + "BuildSketch": 57, + "BuildPart": 55, + "extrude": 40, + "Circle": 29, + "Rectangle": 25, + "Locations": 23, + "Box": 18, + "Line": 18, + "BuildLine": 16, + "fillet": 15, + "RegularPolygon": 14, + "GridLocations": 11, + "Plane": 10, + "make_face": 9, + "Cylinder": 8, + "mirror": 8, + "offset": 8, + "Spline": 6, + "sweep": 6, + "Polyline": 5, + "PolarLocations": 5, + "JernArc": 5, + "insert": 5, + "Hole": 4, + "CounterBoreHole": 4, + "split": 4, + "revolve": 4, + "RadiusArc": 4, + "Vector": 4, + "chamfer": 3, + "CounterSinkHole": 3, + "PolarLine": 3, + "ThreePointArc": 2, + "Axis": 2, + "loft": 2, + "Sphere": 2, + "Text": 2, + "SlotArc": 2, + "Rot": 2, + "Bezier": 1, + "SlotCenterToCenter": 1, + "Ellipse": 1, + "Location": 1, + "SlotOverall": 1, + "scale": 1, + "section": 1, + "RectangleRounded": 1, + "Color": 1, + "Compound": 1, + "Helix": 1 + }, + "method_calls": { + "faces": 26, + "sort_by": 19, + "edges": 15, + "group_by": 11, + "offset": 11, + "vertices": 9, + "filter_by": 7, + "filter_by_position": 5, + "center": 2, + "wires": 2, + "rotated": 1, + "solids": 1, + "shift_origin": 1, + "rotate": 1, + "reverse": 1, + "basicConfig": 1, + "resolve": 1, + "Path": 1, + "info": 1, + "face": 1, + "bounding_box": 1, + "inner_wires": 1, + "find_intersection_points": 1, + "to_local_coords": 1 + }, + "models": [ + { + "id": 1, + "name": "矩形板", + "file": "models/01_rectangular_plate.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L56-L59", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "Box": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": {} + }, + { + "id": 2, + "name": "带孔板", + "file": "models/02_plate_with_hole.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L69-L74", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "Box": 1, + "Cylinder": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "Div": 1 + } + }, + { + "id": 3, + "name": "棱柱实体", + "file": "models/03_prismatic_solid.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L83-L89", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "BuildSketch": 1, + "Circle": 1, + "Rectangle": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "Div": 2, + "Mult": 1 + } + }, + { + "id": 4, + "name": "直线与圆弧轮廓", + "file": "models/04_lines_and_arcs_profile.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L98-L108", + "builder_context_present": true, + "top_level_call_sites": { + "Line": 3, + "BuildPart": 1, + "BuildSketch": 1, + "BuildLine": 1, + "ThreePointArc": 1, + "make_face": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "Mult": 1 + } + }, + { + "id": 5, + "name": "偏置孔与方孔", + "file": "models/05_offset_cutouts.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L117-L126", + "builder_context_present": true, + "top_level_call_sites": { + "Circle": 2, + "Locations": 2, + "BuildPart": 1, + "BuildSketch": 1, + "Rectangle": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": {} + }, + { + "id": 6, + "name": "点阵圆孔", + "file": "models/06_point_list_holes.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L135-L142", + "builder_context_present": true, + "top_level_call_sites": { + "Circle": 2, + "BuildPart": 1, + "BuildSketch": 1, + "Locations": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": {} + }, + { + "id": 7, + "name": "多边形孔板", + "file": "models/07_polygon_holes.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L150-L157", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "BuildSketch": 1, + "Rectangle": 1, + "Locations": 1, + "RegularPolygon": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "Mult": 3 + } + }, + { + "id": 8, + "name": "工字梁", + "file": "models/08_i_beam.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L166-L184", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "BuildSketch": 1, + "BuildLine": 1, + "Polyline": 1, + "mirror": 1, + "make_face": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "Div": 14, + "Sub": 4 + } + }, + { + "id": 9, + "name": "圆角与倒角板", + "file": "models/09_fillets_and_chamfers.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L193-L198", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "Box": 1, + "chamfer": 1, + "fillet": 1 + }, + "method_call_sites": { + "edges": 2, + "group_by": 1, + "filter_by": 1 + }, + "operator_syntax_counts": {} + }, + { + "id": 10, + "name": "圆角孔板", + "file": "models/10_filleted_hole.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L207-L212", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "Box": 1, + "Hole": 1, + "fillet": 1 + }, + "method_call_sites": { + "group_by": 1, + "edges": 1 + }, + "operator_syntax_counts": { + "Div": 1 + } + }, + { + "id": 11, + "name": "网格多边形孔", + "file": "models/11_grid_polygon_holes.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L221-L232", + "builder_context_present": true, + "top_level_call_sites": { + "fillet": 2, + "BuildPart": 1, + "Box": 1, + "chamfer": 1, + "Hole": 1, + "BuildSketch": 1, + "GridLocations": 1, + "RegularPolygon": 1, + "extrude": 1 + }, + "method_call_sites": { + "edges": 3, + "sort_by": 2, + "group_by": 1, + "filter_by": 1, + "faces": 1 + }, + "operator_syntax_counts": { + "Div": 3 + } + }, + { + "id": 12, + "name": "样条轮廓实体", + "file": "models/12_spline_profile.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L241-L259", + "builder_context_present": true, + "top_level_call_sites": { + "Line": 3, + "BuildPart": 1, + "BuildSketch": 1, + "BuildLine": 1, + "Spline": 1, + "make_face": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": {} + }, + { + "id": 13, + "name": "沉头孔与沉孔盘", + "file": "models/13_countersink_counterbore.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L269-L276", + "builder_context_present": true, + "top_level_call_sites": { + "PolarLocations": 2, + "BuildPart": 1, + "Cylinder": 1, + "Locations": 1, + "CounterSinkHole": 1, + "CounterBoreHole": 1 + }, + "method_call_sites": { + "sort_by": 1, + "faces": 1 + }, + "operator_syntax_counts": { + "Mult": 2 + } + }, + { + "id": 14, + "name": "方形截面扫掠", + "file": "models/14_swept_square_tube.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L285-L294", + "builder_context_present": true, + "top_level_call_sites": { + "JernArc": 2, + "BuildPart": 1, + "BuildLine": 1, + "Line": 1, + "BuildSketch": 1, + "Rectangle": 1, + "sweep": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "MatMult": 3, + "Mod": 1, + "Add": 1 + } + }, + { + "id": 15, + "name": "对称轮廓实体", + "file": "models/15_mirrored_profile.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L304-L316", + "builder_context_present": true, + "top_level_call_sites": { + "Line": 5, + "BuildPart": 1, + "BuildSketch": 1, + "BuildLine": 1, + "mirror": 1, + "make_face": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "MatMult": 8, + "Add": 3 + } + }, + { + "id": 16, + "name": "三维镜像组合", + "file": "models/16_mirrored_3d_parts.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L326-L342", + "builder_context_present": true, + "top_level_call_sites": { + "mirror": 4, + "BuildPart": 2, + "Rectangle": 2, + "BuildSketch": 1, + "fillet": 1, + "GridLocations": 1, + "Circle": 1, + "extrude": 1, + "insert": 1 + }, + "method_call_sites": { + "offset": 4, + "vertices": 1 + }, + "operator_syntax_counts": { + "Div": 3 + } + }, + { + "id": 17, + "name": "面镜像棱柱", + "file": "models/17_face_mirror.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L351-L357", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "BuildSketch": 1, + "RegularPolygon": 1, + "extrude": 1, + "mirror": 1, + "Plane": 1 + }, + "method_call_sites": { + "group_by": 1, + "faces": 1 + }, + "operator_syntax_counts": {} + }, + { + "id": 18, + "name": "面定位方孔板", + "file": "models/18_face_cutout.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L367-L376", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "Box": 1, + "chamfer": 1, + "fillet": 1, + "BuildSketch": 1, + "Rectangle": 1, + "extrude": 1 + }, + "method_call_sites": { + "edges": 2, + "group_by": 1, + "filter_by": 1, + "sort_by": 1, + "faces": 1 + }, + "operator_syntax_counts": { + "Mult": 2 + } + }, + { + "id": 19, + "name": "顶点定位缺口板", + "file": "models/19_vertex_cutouts.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L385-L398", + "builder_context_present": true, + "top_level_call_sites": { + "BuildSketch": 2, + "extrude": 2, + "BuildPart": 1, + "RegularPolygon": 1, + "Axis": 1, + "Locations": 1, + "Circle": 1 + }, + "method_call_sites": { + "sort_by": 2, + "vertices": 2, + "faces": 1, + "group_by": 1 + }, + "operator_syntax_counts": { + "Div": 2 + } + }, + { + "id": 20, + "name": "偏置平面圆柱组合", + "file": "models/20_offset_plane_cylinder.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L407-L414", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "Box": 1, + "Plane": 1, + "BuildSketch": 1, + "Circle": 1, + "extrude": 1 + }, + "method_call_sites": { + "group_by": 1, + "faces": 1, + "offset": 1 + }, + "operator_syntax_counts": { + "Mult": 1, + "Div": 1 + } + }, + { + "id": 21, + "name": "交叉圆柱", + "file": "models/21_crossed_cylinders.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L423-L431", + "builder_context_present": true, + "top_level_call_sites": { + "BuildSketch": 2, + "Circle": 2, + "extrude": 2, + "BuildPart": 1, + "Plane": 1 + }, + "method_call_sites": { + "center": 1 + }, + "operator_syntax_counts": { + "Div": 2 + } + }, + { + "id": 22, + "name": "倾斜钻孔板", + "file": "models/22_angled_drill_holes.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L440-L448", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "Box": 1, + "Plane": 1, + "BuildSketch": 1, + "GridLocations": 1, + "Circle": 1, + "extrude": 1 + }, + "method_call_sites": { + "rotated": 1, + "group_by": 1, + "faces": 1 + }, + "operator_syntax_counts": { + "Div": 3 + } + }, + { + "id": 23, + "name": "旋转轮廓实体", + "file": "models/23_revolved_profile.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L457-L475", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "BuildSketch": 1, + "BuildLine": 1, + "Polyline": 1, + "Line": 1, + "make_face": 1, + "Locations": 1, + "Circle": 1, + "split": 1, + "revolve": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "MatMult": 2 + } + }, + { + "id": 24, + "name": "圆到矩形放样", + "file": "models/24_circle_rectangle_loft.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L484-L492", + "builder_context_present": true, + "top_level_call_sites": { + "BuildSketch": 2, + "BuildPart": 1, + "Box": 1, + "Circle": 1, + "Rectangle": 1, + "loft": 1 + }, + "method_call_sites": { + "faces": 2, + "group_by": 1, + "offset": 1 + }, + "operator_syntax_counts": { + "Div": 4 + } + }, + { + "id": 25, + "name": "多边形偏置层", + "file": "models/25_offset_polygon_layers.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L501-L512", + "builder_context_present": true, + "top_level_call_sites": { + "BuildSketch": 3, + "RegularPolygon": 3, + "offset": 2, + "BuildPart": 1, + "extrude": 1 + }, + "method_call_sites": { + "offset": 2 + }, + "operator_syntax_counts": {} + }, + { + "id": 26, + "name": "薄壁盒", + "file": "models/26_thin_wall_box.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L521-L526", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "Box": 1, + "offset": 1 + }, + "method_call_sites": { + "sort_by": 1, + "faces": 1 + }, + "operator_syntax_counts": {} + }, + { + "id": 27, + "name": "剖切孔板", + "file": "models/27_split_plate.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L535-L542", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "Box": 1, + "BuildSketch": 1, + "Circle": 1, + "extrude": 1, + "split": 1, + "Plane": 1 + }, + "method_call_sites": { + "sort_by": 2, + "faces": 2, + "offset": 1 + }, + "operator_syntax_counts": { + "Div": 2 + } + }, + { + "id": 28, + "name": "面定位球体钻孔", + "file": "models/28_face_located_sphere_holes.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L551-L561", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "BuildSketch": 1, + "RegularPolygon": 1, + "extrude": 1, + "Sphere": 1, + "Locations": 1, + "Hole": 1 + }, + "method_call_sites": { + "group_by": 1, + "faces": 1 + }, + "operator_syntax_counts": { + "Div": 3 + } + }, + { + "id": 29, + "name": "OCC 瓶子", + "file": "models/29_occ_bottle.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L570-L586", + "builder_context_present": true, + "top_level_call_sites": { + "BuildSketch": 2, + "Line": 2, + "extrude": 2, + "BuildPart": 1, + "BuildLine": 1, + "ThreePointArc": 1, + "mirror": 1, + "make_face": 1, + "fillet": 1, + "Circle": 1, + "offset": 1 + }, + "method_call_sites": { + "sort_by": 2, + "faces": 2, + "offset": 1, + "edges": 1, + "solids": 1 + }, + "operator_syntax_counts": { + "Div": 5, + "MatMult": 3, + "Add": 2 + } + }, + { + "id": 30, + "name": "贝塞尔轮廓实体", + "file": "models/30_bezier_profile.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L595-L621", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "BuildSketch": 1, + "BuildLine": 1, + "Polyline": 1, + "Bezier": 1, + "make_face": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": {} + }, + { + "id": 31, + "name": "嵌套定位阵列", + "file": "models/31_nested_location_pattern.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L630-L639", + "builder_context_present": true, + "top_level_call_sites": { + "RegularPolygon": 3, + "BuildPart": 1, + "BuildSketch": 1, + "PolarLocations": 1, + "GridLocations": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "Mult": 3, + "Div": 1 + } + }, + { + "id": 32, + "name": "变高度阵列", + "file": "models/32_variable_height_pattern.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L648-L657", + "builder_context_present": true, + "top_level_call_sites": { + "RegularPolygon": 2, + "BuildPart": 1, + "BuildSketch": 1, + "PolarLocations": 1, + "insert": 1, + "extrude": 1 + }, + "method_call_sites": { + "faces": 1 + }, + "operator_syntax_counts": { + "Mult": 2, + "Div": 1, + "Add": 1 + } + }, + { + "id": 33, + "name": "函数生成阵列", + "file": "models/33_function_generated_pattern.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L666-L683", + "builder_context_present": true, + "top_level_call_sites": { + "BuildSketch": 2, + "insert": 2, + "Locations": 1, + "RegularPolygon": 1, + "BuildPart": 1, + "PolarLocations": 1, + "extrude": 1 + }, + "method_call_sites": { + "faces": 1 + }, + "operator_syntax_counts": { + "Add": 2, + "Mult": 2, + "Div": 1 + } + }, + { + "id": 34, + "name": "凸字与凹字板", + "file": "models/34_embossed_debossed_text.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L692-L702", + "builder_context_present": true, + "top_level_call_sites": { + "BuildSketch": 2, + "Text": 2, + "extrude": 2, + "BuildPart": 1, + "Box": 1 + }, + "method_call_sites": { + "sort_by": 1, + "faces": 1 + }, + "operator_syntax_counts": {} + }, + { + "id": 35, + "name": "直槽与圆弧槽板", + "file": "models/35_curved_slots.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L711-L724", + "builder_context_present": true, + "top_level_call_sites": { + "BuildLine": 2, + "RadiusArc": 2, + "SlotArc": 2, + "BuildPart": 1, + "Box": 1, + "BuildSketch": 1, + "SlotCenterToCenter": 1, + "extrude": 1 + }, + "method_call_sites": { + "edges": 2, + "sort_by": 1, + "faces": 1 + }, + "operator_syntax_counts": { + "Div": 7 + } + }, + { + "id": 36, + "name": "拉伸到曲面", + "file": "models/36_extrude_until.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L733-L742", + "builder_context_present": true, + "top_level_call_sites": { + "BuildSketch": 2, + "BuildPart": 1, + "Locations": 1, + "Circle": 1, + "revolve": 1, + "Rectangle": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": {} + }, + { + "id": 37, + "name": "平面定位复合轮廓", + "file": "models/37_positioned_sketches.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L751-L760", + "builder_context_present": true, + "top_level_call_sites": { + "BuildSketch": 3, + "BuildPart": 1, + "Rectangle": 1, + "Circle": 1, + "Plane": 1, + "Ellipse": 1, + "extrude": 1 + }, + "method_call_sites": { + "shift_origin": 1, + "sort_by": 1, + "group_by": 1, + "vertices": 1 + }, + "operator_syntax_counts": {} + }, + { + "id": 38, + "name": "旋转盒体阵列", + "file": "models/38_rotated_boxes.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/docs/general_examples.py#L769-L780", + "builder_context_present": true, + "top_level_call_sites": { + "Box": 4, + "Locations": 3, + "BuildPart": 2, + "Rot": 1, + "insert": 1, + "Location": 1 + }, + "method_call_sites": { + "rotate": 1 + }, + "operator_syntax_counts": { + "Mult": 2 + } + }, + { + "id": 39, + "name": "洞洞板 J 形挂钩", + "file": "models/39_pegboard_j_hook.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/pegboard_j_hook.py", + "builder_context_present": true, + "top_level_call_sites": { + "JernArc": 3, + "PolarLine": 3, + "BuildLine": 2, + "Line": 2, + "BuildSketch": 2, + "Circle": 2, + "sweep": 2, + "split": 2, + "Plane": 2, + "BuildPart": 1 + }, + "method_call_sites": { + "wires": 2, + "reverse": 1 + }, + "operator_syntax_counts": { + "Div": 8, + "MatMult": 6, + "Mod": 6, + "Sub": 3, + "Add": 2, + "Mult": 2 + } + }, + { + "id": 40, + "name": "抽屉把手", + "file": "models/40_handle.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/handle.py", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "BuildLine": 1, + "Spline": 1, + "BuildSketch": 1, + "Circle": 1, + "Rectangle": 1, + "fillet": 1, + "sweep": 1 + }, + "method_call_sites": { + "vertices": 1 + }, + "operator_syntax_counts": { + "Add": 1, + "BitXor": 1, + "Div": 1, + "Mod": 1, + "Sub": 1 + } + }, + { + "id": 41, + "name": "轴承座", + "file": "models/41_pillow_block.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/pillow_block.py", + "builder_context_present": true, + "top_level_call_sites": { + "CounterBoreHole": 2, + "BuildPart": 1, + "BuildSketch": 1, + "Rectangle": 1, + "fillet": 1, + "extrude": 1, + "Locations": 1, + "GridLocations": 1 + }, + "method_call_sites": { + "vertices": 1, + "sort_by": 1, + "faces": 1 + }, + "operator_syntax_counts": { + "Sub": 2, + "Mult": 2 + } + }, + { + "id": 42, + "name": "DIN 导轨", + "file": "models/42_din_rail.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/din_rail.py", + "builder_context_present": true, + "top_level_call_sites": { + "Rectangle": 3, + "BuildSketch": 2, + "fillet": 2, + "extrude": 2, + "BuildPart": 1, + "GridLocations": 1, + "SlotOverall": 1 + }, + "method_call_sites": { + "filter_by_position": 2, + "vertices": 2, + "basicConfig": 1, + "resolve": 1, + "Path": 1, + "info": 1 + }, + "operator_syntax_counts": { + "Div": 7, + "Sub": 3, + "Mult": 1, + "Add": 1, + "FloorDiv": 1 + } + }, + { + "id": 43, + "name": "积木块", + "file": "models/43_lego.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/lego.py", + "builder_context_present": true, + "top_level_call_sites": { + "Rectangle": 4, + "GridLocations": 4, + "BuildPart": 2, + "Circle": 2, + "BuildSketch": 1, + "offset": 1, + "extrude": 1, + "Locations": 1, + "Box": 1, + "Cylinder": 1 + }, + "method_call_sites": { + "sort_by": 2, + "vertices": 1, + "faces": 1 + }, + "operator_syntax_counts": { + "Sub": 5, + "Mult": 3, + "Add": 3, + "Div": 3 + } + }, + { + "id": 44, + "name": "多截面放样壳体", + "file": "models/44_loft.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/loft.py", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 1, + "BuildSketch": 1, + "Plane": 1, + "Circle": 1, + "loft": 1, + "offset": 1 + }, + "method_call_sites": { + "filter_by": 1, + "faces": 1 + }, + "operator_syntax_counts": { + "Mult": 4, + "Add": 2, + "Div": 1, + "Sub": 1 + } + }, + { + "id": 45, + "name": "Cherry MX 键帽", + "file": "models/45_key_cap.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/key_cap.py", + "builder_context_present": true, + "top_level_call_sites": { + "Rectangle": 5, + "BuildSketch": 3, + "extrude": 3, + "Circle": 2, + "BuildPart": 1, + "Locations": 1, + "Sphere": 1, + "fillet": 1, + "scale": 1, + "section": 1, + "Plane": 1 + }, + "method_call_sites": { + "filter_by_position": 2, + "edges": 1, + "face": 1, + "offset": 1, + "bounding_box": 1, + "inner_wires": 1, + "faces": 1 + }, + "operator_syntax_counts": { + "Mult": 21, + "Div": 2, + "Sub": 1 + } + }, + { + "id": 46, + "name": "茶杯", + "file": "models/46_tea_cup.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/tea_cup.py", + "builder_context_present": true, + "top_level_call_sites": { + "BuildSketch": 2, + "BuildLine": 2, + "Spline": 2, + "BuildPart": 1, + "Polyline": 1, + "make_face": 1, + "revolve": 1, + "offset": 1, + "Locations": 1, + "Cylinder": 1, + "fillet": 1, + "Axis": 1, + "RectangleRounded": 1, + "sweep": 1, + "Color": 1 + }, + "method_call_sites": { + "filter_by": 1, + "faces": 1, + "edges": 1, + "find_intersection_points": 1, + "to_local_coords": 1 + }, + "operator_syntax_counts": { + "Mult": 15, + "MatMult": 6, + "Add": 3, + "Sub": 3, + "Div": 2, + "BitXor": 1 + } + }, + { + "id": 47, + "name": "花瓶", + "file": "models/47_vase.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/vase.py", + "builder_context_present": true, + "top_level_call_sites": { + "Vector": 4, + "RadiusArc": 2, + "Spline": 2, + "fillet": 2, + "BuildPart": 1, + "BuildSketch": 1, + "BuildLine": 1, + "Line": 1, + "Polyline": 1, + "make_face": 1, + "revolve": 1, + "offset": 1, + "Rot": 1 + }, + "method_call_sites": { + "filter_by": 2, + "edges": 2, + "faces": 1, + "filter_by_position": 1, + "sort_by": 1 + }, + "operator_syntax_counts": { + "MatMult": 11, + "Add": 5, + "Mod": 2, + "Mult": 1 + } + }, + { + "id": 48, + "name": "带孔电路板", + "file": "models/48_circuit_board.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/circuit_board.py", + "builder_context_present": true, + "top_level_call_sites": { + "Circle": 3, + "Locations": 2, + "BuildPart": 1, + "BuildSketch": 1, + "Rectangle": 1, + "GridLocations": 1, + "extrude": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "Mult": 5, + "Sub": 3, + "FloorDiv": 2 + } + }, + { + "id": 49, + "name": "四种孔型组合", + "file": "models/49_holes.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/holes.py", + "builder_context_present": true, + "top_level_call_sites": { + "BuildPart": 4, + "Cylinder": 4, + "Locations": 4, + "CounterSinkHole": 2, + "Hole": 1, + "CounterBoreHole": 1, + "Compound": 1 + }, + "method_call_sites": { + "center": 1, + "sort_by": 1, + "faces": 1 + }, + "operator_syntax_counts": {} + }, + { + "id": 50, + "name": "螺旋压缩弹簧", + "file": "models/50_spring.py", + "source_url": "https://github.com/gumyr/build123d/blob/38effd343e1508964673faf59300a5cc68fbedc1/examples/spring.py", + "builder_context_present": false, + "top_level_call_sites": { + "Helix": 1, + "Circle": 1, + "sweep": 1 + }, + "method_call_sites": {}, + "operator_syntax_counts": { + "Mult": 1, + "BitXor": 1 + } + } + ] + }, + "verification": { + "source_report": { + "path": "tools/research/build123dftc/out/validate.json", + "sha256": "a0927de455277a4878768d6eba21c912e2f5af273b1f9c5817653ff80019fe18" + }, + "accepted_models": [ + "01_rectangular_plate", + "02_plate_with_hole", + "03_prismatic_solid", + "04_lines_and_arcs_profile", + "05_offset_cutouts", + "06_point_list_holes", + "07_polygon_holes", + "08_i_beam", + "09_fillets_and_chamfers", + "10_filleted_hole", + "11_grid_polygon_holes", + "12_spline_profile", + "13_countersink_counterbore", + "14_swept_square_tube", + "15_mirrored_profile", + "16_mirrored_3d_parts", + "17_face_mirror", + "18_face_cutout", + "19_vertex_cutouts", + "20_offset_plane_cylinder", + "21_crossed_cylinders", + "22_angled_drill_holes", + "23_revolved_profile", + "24_circle_rectangle_loft", + "25_offset_polygon_layers", + "26_thin_wall_box", + "27_split_plate", + "28_face_located_sphere_holes", + "29_occ_bottle", + "30_bezier_profile", + "31_nested_location_pattern", + "32_variable_height_pattern", + "33_function_generated_pattern", + "34_embossed_debossed_text", + "35_curved_slots", + "36_extrude_until", + "37_positioned_sketches", + "38_rotated_boxes", + "39_pegboard_j_hook", + "40_handle", + "41_pillow_block", + "42_din_rail", + "43_lego", + "44_loft", + "45_key_cap", + "47_vase", + "48_circuit_board", + "49_holes", + "50_spring" + ], + "rejected_or_unverified_models": [ + "46_tea_cup" + ], + "scope": "Sample-level acceptance is not a claim of all-API or all-parameter coverage.", + "verified_top_level_entries": 48, + "verified_public_member_entries": 23 + } +} diff --git a/tools/research/build123dftc/b3ftc/_reference_worker.py b/tools/research/build123dftc/b3ftc/_reference_worker.py new file mode 100644 index 00000000..d034791a --- /dev/null +++ b/tools/research/build123dftc/b3ftc/_reference_worker.py @@ -0,0 +1,44 @@ +"""Compare two STEP files in an independently selected OCCT environment.""" +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +from _validate_worker import _compare_reference, _read_step, _solid_count, _volume + + +def run(actual_step, reference_step): + import OCP + from OCP.Bnd import Bnd_Box + from OCP.BRepBndLib import BRepBndLib + actual = _read_step(actual_step) + bounds = Bnd_Box() + BRepBndLib.AddOptimal_s(actual, bounds, False, False) + low, high = bounds.CornerMin(), bounds.CornerMax() + bbox = [float(getattr(point, axis)()) for point in (low, high) for axis in "XYZ"] + return {"status": "ok", **_compare_reference([actual], reference_step), + "reference_kernel": getattr(OCP, "__version__", "unknown"), + "roundtrip_actual_volume": _volume(actual), + "roundtrip_actual_bbox": bbox, + "roundtrip_actual_solid_count": _solid_count(actual), + "roundtrip_actual_valid": True} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--actual-step", type=Path, required=True) + parser.add_argument("--reference-step", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + try: + result = run(args.actual_step, args.reference_step) + except Exception as exc: + result = {"status": "reference_error", "reference_status": "error", + "reference_error": f"{type(exc).__name__}: {exc}"} + args.output.write_text(json.dumps(result, ensure_ascii=False, allow_nan=False) + "\n") + return 0 if result["status"] == "ok" else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/research/build123dftc/b3ftc/_trace_worker.py b/tools/research/build123dftc/b3ftc/_trace_worker.py new file mode 100644 index 00000000..8a5267ef --- /dev/null +++ b/tools/research/build123dftc/b3ftc/_trace_worker.py @@ -0,0 +1,13 @@ +"""Private process boundary. Model output goes to the parent's log, not JSON.""" +import json +from pathlib import Path +import sys + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +from b3ftc.tracer import trace_file + + +if __name__ == "__main__": + source, output = map(Path, sys.argv[1:]) + payload = trace_file(source) + output.write_text(json.dumps(payload, ensure_ascii=False, indent=2, allow_nan=False) + "\n", encoding="utf-8") diff --git a/tools/research/build123dftc/b3ftc/_validate_worker.py b/tools/research/build123dftc/b3ftc/_validate_worker.py new file mode 100644 index 00000000..506f2ce2 --- /dev/null +++ b/tools/research/build123dftc/b3ftc/_validate_worker.py @@ -0,0 +1,260 @@ +"""Isolated CAD worker; communicates only through an explicit JSON file.""" +from __future__ import annotations + +import argparse +import importlib.util +import json +import math +from pathlib import Path +import shutil +import traceback +import uuid + + +def _volume(shape): + if not _solid_count(shape): + from OCP.TopAbs import TopAbs_FACE + from OCP.TopExp import TopExp_Explorer + if TopExp_Explorer(shape, TopAbs_FACE).More(): + raise ValueError("volume result has faces but no closed solid") + return 0.0 + from OCP.BRepGProp import BRepGProp + from OCP.GProp import GProp_GProps + properties = GProp_GProps() + error = BRepGProp.VolumePropertiesGK_s(shape, properties, 1e-9, True, True) + if error < 0: + raise ValueError("Gauss-Kronrod volume integration failed") + return float(properties.Mass()) + + +def _area(shape): + from OCP.BRepGProp import BRepGProp + from OCP.BRepBuilderAPI import BRepBuilderAPI_Copy + from OCP.GeomAbs import GeomAbs_C1 + from OCP.GProp import GProp_GProps + from OCP.ShapeUpgrade import ShapeUpgrade_ShapeDivideContinuity + # Integration must respect C0 knot boundaries. Work on independent geometry + # so this numerical conditioning never changes the FTC or exported STEP. + copied = BRepBuilderAPI_Copy(shape, True, False).Shape() + divide = ShapeUpgrade_ShapeDivideContinuity(copied) + divide.SetSurfaceCriterion(GeomAbs_C1) + divide.SetBoundaryCriterion(GeomAbs_C1) + divide.SetPCurveCriterion(GeomAbs_C1) + divide.Perform() + measurement = divide.Result() + if measurement.IsNull(): + raise ValueError("surface integration continuity split produced no shape") + properties = GProp_GProps() + BRepGProp.SurfaceProperties_s(S=measurement, SProps=properties, Eps=1e-10, SkipShared=False) + return float(properties.Mass()) + + +def _solid_count(shape): + from OCP.TopAbs import TopAbs_SOLID + from OCP.TopExp import TopExp_Explorer + explorer = TopExp_Explorer(shape, TopAbs_SOLID) + count = 0 + while explorer.More(): + count += 1 + explorer.Next() + return count + + +def _read_step(step): + from OCP.BRepCheck import BRepCheck_Analyzer + from OCP.IFSelect import IFSelect_RetDone + from OCP.STEPControl import STEPControl_Reader + if not step.is_file(): + raise FileNotFoundError(f"reference STEP does not exist: {step}") + reader = STEPControl_Reader() + if reader.ReadFile(str(step)) != IFSelect_RetDone or reader.TransferRoots() == 0: + raise ValueError("reference STEP could not be read") + reference = reader.OneShape() + if reference.IsNull() or not BRepCheck_Analyzer(reference).IsValid() or not _solid_count(reference): + raise ValueError("reference STEP contains no valid solids") + from OCP.BRepClass3d import BRepClass3d_SolidClassifier + from OCP.TopAbs import TopAbs_SOLID, TopAbs_OUT + from OCP.TopExp import TopExp_Explorer + explorer = TopExp_Explorer(reference, TopAbs_SOLID) + while explorer.More(): + classifier = BRepClass3d_SolidClassifier(explorer.Current()) + classifier.PerformInfinitePoint(1e-7) + if classifier.State() != TopAbs_OUT: + raise ValueError("reference STEP solid orientation includes the infinite exterior") + explorer.Next() + return reference + + +def _compare_reference(shapes, step): + from OCP.BRepAlgoAPI import BRepAlgoAPI_Cut, BRepAlgoAPI_Fuse + from OCP.BRepCheck import BRepCheck_Analyzer + reference = _read_step(step) + # Treat BODIES as a geometric set. Fuse disjoint bodies too, avoiding double + # counting overlap when comparing a multi-body result to STEP assemblies. + actual = shapes[0] + for shape in shapes[1:]: + fusion = BRepAlgoAPI_Fuse(actual, shape) + fusion.Build() + if not fusion.IsDone(): + raise ValueError("could not combine actual bodies for comparison") + actual = fusion.Shape() + tolerance = _kernel_tolerance(actual, reference) + # Configure before the first Build: the two-shape constructor would already + # run the intersection and retain a pave filler computed at default tolerance. + missing = _cut(reference, actual, tolerance) + extra = _cut(actual, reference, tolerance) + for operation in (missing, extra): + if not operation.IsDone() or operation.Shape().IsNull(): + return {"reference_status": "error", "reference_error": "STEP symmetric difference failed", + "reference_boolean_fuzzy_tolerance": tolerance} + if not BRepCheck_Analyzer(operation.Shape()).IsValid(): + return {"reference_status": "error", "reference_error": "STEP symmetric difference produced invalid topology", + "reference_boolean_fuzzy_tolerance": tolerance} + return {"reference_status": "ok", "reference_volume": _volume(reference), + "reference_boolean_fuzzy_tolerance": tolerance, + "symmetric_difference_volume": abs(_volume(missing.Shape())) + abs(_volume(extra.Shape()))} + + +def _cut(left, right, tolerance): + from OCP.BRepAlgoAPI import BRepAlgoAPI_Cut + try: + from OCP.TopTools import TopTools_ListOfShape as ShapeList + except ImportError: + from OCP.collections import List_TopoDS_Shape as ShapeList + arguments, tools = ShapeList(), ShapeList() + arguments.Append(left) + tools.Append(right) + operation = BRepAlgoAPI_Cut() + operation.SetArguments(arguments) + operation.SetTools(tools) + operation.SetNonDestructive(True) + operation.SetFuzzyValue(tolerance) + operation.Build() + return operation + + +def _kernel_tolerance(*shapes): + from OCP.BRep import BRep_Tool + from OCP.Precision import Precision + from OCP.TopAbs import TopAbs_VERTEX, TopAbs_EDGE + from OCP.TopExp import TopExp_Explorer + from OCP.TopoDS import TopoDS + tolerance = float(Precision.Confusion_s()) + for shape in shapes: + for kind, name in ((TopAbs_VERTEX, "Vertex"), (TopAbs_EDGE, "Edge")): + cast = getattr(TopoDS, name + "_s", None) or getattr(TopoDS, name) + explorer = TopExp_Explorer(shape, kind) + while explorer.More(): + value = float(BRep_Tool.Tolerance_s(cast(explorer.Current()))) + if not math.isfinite(value) or value < 0: + raise ValueError("invalid reference geometry tolerance") + tolerance = max(tolerance, value) + explorer.Next() + return tolerance + + +def _export_step(shapes, path, options=None): + from OCP.STEPControl import STEPControl_Writer, STEPControl_AsIs + from OCP.Interface import Interface_Static + from OCP.IFSelect import IFSelect_RetDone + writer = STEPControl_Writer() + options = options or {} + pcurves = options.get("write_pcurves", True) + precision = options.get("precision_mode", "AVERAGE") + modes = {"AVERAGE": 0, "GREATEST": 1, "LEAST": -1, "SESSION": 2} + if not isinstance(pcurves, bool) or precision not in modes: + raise ValueError("invalid source STEP export options") + # Honor the declared corpus export contract: spherical seams retain their + # UV curves; freeform sweeps can explicitly request rebuilding on import. + if not Interface_Static.SetIVal_s("write.surfacecurve.mode", int(pcurves)): + raise ValueError("could not configure STEP parameter-curve export") + if not Interface_Static.SetIVal_s("write.precision.mode", modes[precision]): + raise ValueError("could not configure STEP precision mode") + for shape in shapes: + if writer.Transfer(shape, STEPControl_AsIs) != IFSelect_RetDone: + raise ValueError("could not transfer actual geometry for external comparison") + if writer.Write(str(path)) != IFSelect_RetDone: + raise ValueError("could not export actual geometry for external comparison") + return {"write_pcurves": pcurves, "precision_mode": precision, + "rebuild_pcurves_on_import": not pcurves} + + +def run(ftc_path, staging_dir, reference_step=None, export_step=None, export_options=None): + import OCP + from OCP.Bnd import Bnd_Box + from OCP.BRepBndLib import BRepBndLib + from OCP.BRepCheck import BRepCheck_Analyzer + from OCP.TopoDS import TopoDS_Shape + # An isolated path keeps imports/artifacts away from original outputs and + # provides a fresh module/global BODIES namespace on every validation. + staged = staging_dir / (ftc_path.stem + "_" + uuid.uuid4().hex + ".py") + shutil.copyfile(ftc_path, staged) + spec = importlib.util.spec_from_file_location("ftc_validation_" + uuid.uuid4().hex, staged) + if spec is None or spec.loader is None: + raise ValueError("cannot import FTC module") + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + build = getattr(module, "build", None) + if not callable(build): + raise ValueError("FTC module must define callable build()") + build() + bodies = getattr(module, "BODIES", None) + if not isinstance(bodies, (list, tuple)) or not bodies: + return {"status": "ok", "body_count": 0, "solid_count": 0, + "is_valid": False, "volume": None, "bbox": None} + shapes = [] + for index, body in enumerate(bodies): + wrapped = getattr(body, "wrapped", None) + if not isinstance(wrapped, TopoDS_Shape) or wrapped.IsNull(): + raise ValueError(f"BODIES[{index}] is not actual nonempty CAD topology") + if _solid_count(wrapped) < 1: + raise ValueError(f"BODIES[{index}] contains no solid") + shapes.append(wrapped) + bounds = Bnd_Box() + for shape in shapes: + BRepBndLib.AddOptimal_s(shape, bounds, False, False) + volume = sum(_volume(shape) for shape in shapes) + low, high = bounds.CornerMin(), bounds.CornerMax() + bbox = [float(getattr(point, axis)()) for point in (low, high) for axis in "XYZ"] + if not math.isfinite(volume) or not all(map(math.isfinite, bbox)): + raise ValueError("nonfinite actual geometry metrics") + result = {"status": "ok", "body_count": len(bodies), + "solid_count": sum(_solid_count(shape) for shape in shapes), + "is_valid": all(BRepCheck_Analyzer(shape).IsValid() for shape in shapes), + "volume": volume, "area": sum(_area(shape) for shape in shapes), "bbox": bbox, + "build_kernel": getattr(OCP, "__version__", "unknown"), + "volume_method": "Gauss-Kronrod, epsilon=1e-9, closed shells, BSpline spans", + "area_method": "Independent geometry copy, C1 continuity spans, adaptive epsilon=1e-10"} + if reference_step is not None: + try: + result.update(_compare_reference(shapes, reference_step)) + except Exception as exc: + result.update(reference_status="error", reference_error=f"{type(exc).__name__}: {exc}") + if export_step is not None: + try: + result["reference_export_options"] = _export_step(shapes, export_step, export_options) + except Exception as exc: + result.update(reference_status="error", reference_error=f"{type(exc).__name__}: {exc}") + return result + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--ftc", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--staging-dir", type=Path, required=True) + parser.add_argument("--reference-step", type=Path) + parser.add_argument("--export-step", type=Path) + parser.add_argument("--export-options", type=json.loads) + args = parser.parse_args() + try: + result = run(args.ftc, args.staging_dir, args.reference_step, args.export_step, args.export_options) + except BaseException as exc: + result = {"status": "build_error", "error": f"{type(exc).__name__}: {exc}", + "traceback": traceback.format_exc(limit=5)} + args.output.write_text(json.dumps(result, ensure_ascii=False, allow_nan=False) + "\n") + return 0 if result.get("status") == "ok" else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/research/build123dftc/b3ftc/emit.py b/tools/research/build123dftc/b3ftc/emit.py new file mode 100644 index 00000000..0a7a1de7 --- /dev/null +++ b/tools/research/build123dftc/b3ftc/emit.py @@ -0,0 +1,140 @@ +"""Deterministic FTC formatting and topology-fingerprint QL selectors. + +This module has no CAD dependency: generated programs use only SimpleCADAPI. +""" +from __future__ import annotations +import math +import re +from typing import Any, Mapping, Sequence + +ROLES = frozenset({'build', 'add', 'subtract', 'intersect', 'modify', 'pattern', 'annotate'}) + + +def fmt_num(value: float) -> str: + number = float(value) + if not math.isfinite(number): + raise ValueError('non-finite geometry parameter') + if abs(number) < 1e-12: + number = 0.0 + return format(number, '.15g') + + +def fmt_vec(vector: Sequence[float]) -> str: + return '(' + ', '.join(fmt_num(v) for v in vector) + (',' if len(vector) == 1 else '') + ')' + + +def fmt_literal(value: Any) -> str: + if value is None or isinstance(value, (bool, str)): + return repr(value) + if isinstance(value, (int, float)): + return fmt_num(value) + if isinstance(value, (list, tuple)): + return '[' + ', '.join(fmt_literal(v) for v in value) + ']' + if isinstance(value, Mapping): + return '{' + ', '.join(repr(k) + ': ' + fmt_literal(v) for k, v in value.items()) + '}' + raise ValueError(f'unsupported literal type: {type(value).__name__}') + + +class SlugAllocator: + def __init__(self) -> None: + self.counts: dict[str, int] = {} + + def allocate(self, name: str) -> str: + slug = re.sub('[^a-z0-9]+', '-', str(name).lower()).strip('-') or 'feature' + count = self.counts.get(slug, 0) + 1 + self.counts[slug] = count + return slug if count == 1 else f'{slug}-{count}' + + +def block_header(slug: str, role: str, tiers: Sequence[str] = ()) -> str: + if role not in ROLES: + raise ValueError(f'invalid FTC role: {role}') + return f" # ---- feature: {slug} ({', '.join([role, *tiers])}) ----" + + +def fingerprint_selector(fingerprints: Sequence[Mapping[str, Any]], kind: str, tolerance: float = 1e-4) -> str: + """Union individual fingerprint predicates; never select a wide bounding band. + + Each traced edge/face gets its own conjunction. This preserves a disjoint + selected set whose bounding box could otherwise include unrelated topology. + """ + predicates = [] + seen = set() + for fp in fingerprints: + if fp.get('kind', kind) != kind: + continue + terms = [] + geom_type = fp.get('geom_type') or fp.get('type') + if geom_type: + terms.append(f"ql.prop('geom.type', '==', {str(geom_type).upper()!r})") + for name in ('center', 'normal'): + values = fp.get(name) + if values is not None: + for axis, value in zip('xyz', values): + tolerance_here = 1e-5 if name == 'normal' else tolerance + value = round(float(value), 10) + terms.extend([ + f"ql.prop('geom.{name}.{axis}', '>=', {fmt_num(value - tolerance_here)})", + f"ql.prop('geom.{name}.{axis}', '<=', {fmt_num(value + tolerance_here)})", + ]) + for name in ('length', 'area', 'radius'): + if (kind == 'edge' and name == 'area') or (kind == 'face' and name == 'length'): + continue + if fp.get(name) is not None: + value = float(fp[name]) + delta = max(tolerance, abs(value) * 1e-8) + terms.extend([ + f"ql.prop('geom.{name}', '>=', {fmt_num(value - delta)})", + f"ql.prop('geom.{name}', '<=', {fmt_num(value + delta)})", + ]) + if not terms: + raise ValueError(f'{kind} selection lacks geometric fingerprints') + predicate = 'ql.and_(' + ', '.join(terms) + ')' + if predicate not in seen: + seen.add(predicate) + predicates.append(predicate) + if not predicates: + raise ValueError(f'{kind} selection is empty') + combined = predicates[0] if len(predicates) == 1 else 'ql.or_(' + ', '.join(predicates) + ')' + count = len([fp for fp in fingerprints if fp.get('kind', kind) == kind]) + return f'ql.{kind}s().where({combined}).take({count}).exactly({count})' + + +def emit_module(stem: str, lines: Sequence[str], refs: Sequence[str], unsupported: Sequence[str], uses_ql: bool, solid_count: int = 1) -> str: + part_id = 'b3d-' + (re.sub('[^A-Za-z0-9._-]+', '-', stem).strip('-.') or 'part') + result = [f'"""FTC generated from build123d feature trace: {stem.replace(chr(34), chr(39))}."""', + '', 'from pathlib import Path', '', 'import simplecadapi as scad'] + if uses_ql: + result.append('from simplecadapi import ql') + result.extend(['', 'BODIES = None', '', '']) + if solid_count <= 1: + result.extend([f"@scad.part(id={part_id!r}, revision='1.0.0', project_root=Path(__file__).parent)", + 'def build() -> scad.Part:']) + else: + result.append('def _build_bodies():') + result.extend(lines) + for note in unsupported: + result.append(' # untranslated: ' + str(note).replace('\n', ' ')) + if refs: + result.extend([f' bodies = [_b for _group in [{", ".join(refs)}] for _b in _group]', + ' global BODIES', ' BODIES = list(bodies)', + ' return bodies[0]' if solid_count <= 1 else ' return bodies']) + else: + result.append(" raise RuntimeError('feature tree produced no solid')") + if solid_count > 1: + for index in range(solid_count): + result.extend(['', '', f"@scad.part(id={f'{part_id}-body-{index + 1}'!r}, revision='1.0.0', project_root=Path(__file__).parent)", + f'def _build_body_{index + 1}() -> scad.Part:', + f' return _build_bodies()[{index}]']) + result.extend(['', '', 'def build():', + ' parts = [' + ', '.join(f'_build_body_{i + 1}()' for i in range(solid_count)) + ']', + f" @scad.assemble(id={part_id!r}, revision='1.0.0', definitions=parts, project_root=Path(__file__).parent)", + ' def _build_assembly():', + ' # ---- feature: body-components (build) ----', + f' assembly = scad.make_assembly_rassembly(assembly_id={part_id!r})', + ' for index, item in enumerate(parts):', + " component_id = f'body-{index + 1}'", + ' assembly = scad.add_component_rassembly(assembly=assembly, item=item.value, component_id=component_id, placement=scad.identity_placement_rplacement())', + ' assembly = scad.ground_component_rassembly(assembly=assembly, component_id=component_id)', + ' return assembly', ' return _build_assembly()']) + return '\n'.join(result) + '\n' diff --git a/tools/research/build123dftc/b3ftc/geometry.py b/tools/research/build123dftc/b3ftc/geometry.py new file mode 100644 index 00000000..7cf96f89 --- /dev/null +++ b/tools/research/build123dftc/b3ftc/geometry.py @@ -0,0 +1,224 @@ +"""Kernel-independent JSON descriptions of build123d profile geometry. + +The trace contains analytic curves and NURBS control data, never a saved BRep. +Coordinates are in the coordinate system of the actual feature input. +""" +from __future__ import annotations + +from enum import Enum +import math +from typing import Any + + +def vector(value: Any) -> list[float]: + if hasattr(value, "X"): + return [float(getattr(value, n)() if callable(getattr(value, n)) else getattr(value, n)) for n in "XYZ"] + if hasattr(value, "x"): + return [float(value.x), float(value.y), float(value.z)] + return [float(value.X()), float(value.Y()), float(value.Z())] + + +def plane(value: Any) -> dict[str, Any]: + return {"origin": vector(value.origin), "x_dir": vector(value.x_dir), + "y_dir": vector(value.y_dir), "normal": vector(value.z_dir)} + + +def location_matrix(value: Any) -> list[list[float]]: + trsf = value.wrapped.Transformation() + return [[float(trsf.Value(i, j)) for j in range(1, 5)] for i in range(1, 4)] + [[0., 0., 0., 1.]] + + +def serialize(value: Any) -> Any: + if value is None or isinstance(value, (str, bool, int, float)): + return value + if isinstance(value, Enum): + return value.name + if isinstance(value, dict): + return {str(k): serialize(v) for k, v in value.items()} + if isinstance(value, (list, tuple)): + return [serialize(v) for v in value] + name = type(value).__name__ + if name == "Plane": + return plane(value) + if name == "Axis": + return {"origin": vector(value.position), "direction": vector(value.direction)} + if name in {"Location", "Rotation", "Pos", "Rot"} or hasattr(value, "wrapped") and hasattr(value.wrapped, "Transformation"): + return {"matrix": location_matrix(value)} + if name == "Matrix": + return {"matrix": [[float(value.wrapped.Value(i, j)) for j in range(1, 5)] for i in range(1, 4)] + [[0., 0., 0., 1.]]} + if name == "Vector": + return vector(value) + if hasattr(value, "wrapped"): + return {"shape_type": name} + return {"type": name, "repr": repr(value)} + + +def metrics(shape: Any) -> dict[str, Any]: + from OCP.BRepGProp import BRepGProp + from OCP.GProp import GProp_GProps + shapes = shape if isinstance(shape, (list, tuple)) else [shape] + solids = [s for item in shapes if item is not None for s in item.solids()] + if not solids: + return {"volume": 0., "bbox": None, "solid_count": 0} + boxes = [s.bounding_box() for s in solids] + low = [min(vector(box.min)[i] for box in boxes) for i in range(3)] + high = [max(vector(box.max)[i] for box in boxes) for i in range(3)] + volumes, areas = [], [] + for solid in solids: + properties = GProp_GProps() + BRepGProp.VolumePropertiesGK_s(solid.wrapped, properties, 1e-9, True, True) + volumes.append(float(properties.Mass())) + areas.append(surface_area(solid.wrapped)) + return {"volume": sum(volumes), "volume_gk": sum(volumes), "area": sum(areas), "default_volume": sum(float(s.volume) for s in solids), "bbox": low + high, + "solid_count": len(solids)} + + +def surface_area(wrapped: Any) -> float: + """Integrate per smooth span on a geometry copy, preserving the source model. + + OCCT's adaptive surface integrator can miss rational spline knot breaks. + Splitting C0 boundaries/surfaces into C1 spans resolves those breaks before + integration. This temporary topology is used only for the numeric metric. + """ + from OCP.BRepBuilderAPI import BRepBuilderAPI_Copy + from OCP.ShapeUpgrade import ShapeUpgrade_ShapeDivideContinuity + from OCP.GeomAbs import GeomAbs_C1 + from OCP.BRepGProp import BRepGProp + from OCP.GProp import GProp_GProps + copied = BRepBuilderAPI_Copy(wrapped, True, False).Shape() + divider = ShapeUpgrade_ShapeDivideContinuity(copied) + divider.SetSurfaceCriterion(GeomAbs_C1) + divider.SetBoundaryCriterion(GeomAbs_C1) + divider.SetPCurveCriterion(GeomAbs_C1) + divider.Perform() + properties = GProp_GProps() + BRepGProp.SurfaceProperties_s(S=divider.Result(), SProps=properties, Eps=1e-10, SkipShared=False) + return float(properties.Mass()) + + +def fingerprint(shape: Any, parent: Any = None) -> dict[str, Any]: + from build123d import CenterOf + kind = type(shape).__name__.lower() + payload = {"kind": kind, "geom_type": shape.geom_type.name, + "center": vector(shape.center(CenterOf.MASS)) if kind in {"edge", "face"} else vector(shape.center()), + "bbox": vector(shape.bounding_box().min) + vector(shape.bounding_box().max)} + if kind in {"edge", "wire"}: + payload["length"] = float(shape.length) + payload["start"] = vector(shape.position_at(0)) + payload["mid"] = vector(shape.position_at(.5)) + payload["end"] = vector(shape.position_at(1)) + if kind == "face": + payload["area"] = float(shape.area) + if shape.geom_type.name == "PLANE": + try: + payload["normal"] = vector(shape.normal_at()) + except Exception: + pass + if parent is not None: + children = parent.edges() if kind == "edge" else parent.faces() if kind == "face" else parent.vertices() + for index, child in enumerate(children): + if child.wrapped.IsSame(shape.wrapped): + payload["index"] = index + break + return payload + + +def edge(value: Any) -> dict[str, Any]: + from OCP.BRepAdaptor import BRepAdaptor_Curve + adaptor = BRepAdaptor_Curve(value.wrapped) + kind = value.geom_type.name.lower() + first, last = adaptor.FirstParameter(), adaptor.LastParameter() + common = {"start": vector(value.position_at(0)), "end": vector(value.position_at(1)), + "parameter_range": [float(first), float(last)], "reversed": not value.is_forward} + if kind == "line": + return {"kind": "line", **common} + if kind == "circle": + circle = adaptor.Circle() + data = {"center": vector(circle.Location()), "radius": float(circle.Radius()), + "normal": vector(circle.Axis().Direction()), "x_dir": vector(circle.XAxis().Direction())} + if abs(last - first - 2 * math.pi) < 1e-7: + return {"kind": "circle", **common, **data} + return {"kind": "arc", "mid": vector(value.position_at(.5)), **common, **data} + if kind == "ellipse" and abs(last - first - 2 * math.pi) < 1e-7: + ellipse = adaptor.Ellipse() + return {"kind": "ellipse", **common, "center": vector(ellipse.Location()), + "major_radius": float(ellipse.MajorRadius()), "minor_radius": float(ellipse.MinorRadius()), + "x_dir": vector(ellipse.XAxis().Direction()), "y_dir": vector(ellipse.YAxis().Direction()), + "normal": vector(ellipse.Axis().Direction())} + if kind in {"bspline", "bezier", "ellipse", "parabola", "hyperbola"}: + # Segmentation preserves the exact trimmed curve, including NURBS weights. + # Conic arcs become exact rational BSplines rather than sampled polylines. + if kind not in {"bspline", "bezier"}: + from OCP.Geom import Geom_TrimmedCurve + from OCP.GeomConvert import GeomConvert + from OCP.BRep import BRep_Tool + curve = BRep_Tool.Curve_s(value.wrapped, first, last) + spline = GeomConvert.CurveToBSplineCurve_s(Geom_TrimmedCurve(curve, first, last)) + kind = "bspline" + else: + spline = adaptor.BSpline() if kind == "bspline" else adaptor.Bezier() + unclamped = kind == "bspline" and not spline.IsPeriodic() and (spline.Multiplicity(1) < spline.Degree()+1 or spline.Multiplicity(spline.NbKnots()) < spline.Degree()+1) + if unclamped or abs(first - spline.FirstParameter()) > 1e-9 or abs(last - spline.LastParameter()) > 1e-9: + spline = spline.Copy() + spline.Segment(first, last) + # Converted/segmented poles already describe exactly the edge extent. + common["parameter_range"] = [float(spline.FirstParameter()), float(spline.LastParameter())] + data = {"kind": kind, **common, "degree": spline.Degree(), + "poles": [vector(spline.Pole(i)) for i in range(1, spline.NbPoles() + 1)], + "weights": [float(spline.Weight(i)) for i in range(1, spline.NbPoles() + 1)]} + if kind == "bspline": + data.update(knots=[float(spline.Knot(i)) for i in range(1, spline.NbKnots() + 1)], + multiplicities=[spline.Multiplicity(i) for i in range(1, spline.NbKnots() + 1)], + periodic=spline.IsPeriodic()) + return data + # Conics are kept analytic as a full parameterized curve description. + if kind in {"parabola", "hyperbola"}: + conic = adaptor.Parabola() if kind == "parabola" else adaptor.Hyperbola() + data = {"kind": kind, **common, "center": vector(conic.Location()), + "x_dir": vector(conic.XAxis().Direction()), "normal": vector(conic.Axis().Direction())} + if kind == "parabola": + data["focal"] = float(conic.Focal()) + else: + data.update(major_radius=float(conic.MajorRadius()), minor_radius=float(conic.MinorRadius())) + return data + raise ValueError(f"Unsupported profile curve: {value.geom_type.name}") + + +def wire(value: Any) -> dict[str, Any]: + from build123d import Edge + from OCP.BRepTools import BRepTools_WireExplorer + explorer = BRepTools_WireExplorer(value.wrapped) + edges = [] + while explorer.More(): + edges.append(edge(Edge(explorer.Current()))) + explorer.Next() + return {"edges": edges, "closed": bool(value.is_closed)} + + +def profile(value: Any) -> dict[str, Any]: + from build123d import Face, Plane, Vertex, Wire + if isinstance(value, Vertex): + return {"kind": "vertex", "point": vector(value.center())} + if isinstance(value, Wire): + value = Face(value) + if not isinstance(value, Face): + raise ValueError(f"A planar profile was expected, got {type(value).__name__}") + frame = Plane(value) + return {"kind": "face", **plane(frame), + "wires": [wire(value.outer_wire())] + [wire(w) for w in value.inner_wires()]} + + +def path(value: Any) -> dict[str, Any]: + from build123d import Edge, Wire + if isinstance(value, Edge): + return {"edges": [edge(value)], "closed": bool(value.is_closed)} + if not isinstance(value, Wire): + value = Wire(value.edges()) + result = wire(value) + try: + frame = value.find_plane() + if frame is not None: + result.update(planar=True, **plane(frame)) + except Exception: + pass + return result diff --git a/tools/research/build123dftc/b3ftc/profiles.py b/tools/research/build123dftc/b3ftc/profiles.py new file mode 100644 index 00000000..5f7bd469 --- /dev/null +++ b/tools/research/build123dftc/b3ftc/profiles.py @@ -0,0 +1,207 @@ +"""Exact profile reconstruction through native sketch/curve APIs. + +Planar input curves are transcribed into a local sketch, including rational +B-splines and ellipses. Nonplanar sweep paths remain geometry-tier wires. +No tessellation or final-body boundary reconstruction is used. +""" +from __future__ import annotations +import math +from typing import Any, Mapping, Sequence +from .emit import fmt_literal, fmt_num, fmt_vec + + +def dot(a, b): + return sum(float(x) * float(y) for x, y in zip(a, b)) + + +def cross(a, b): + return (a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]) + + +def unit(a): + length = math.sqrt(dot(a, a)) + if length < 1e-12: + raise ValueError('degenerate frame axis') + return tuple(float(x) / length for x in a) + + +def frame(profile): + normal = unit(profile.get('normal', (0, 0, 1))) + u = profile.get('u') or profile.get('x_dir') + if u is None: + seed = (0, 1, 0) if abs(normal[0]) > .8 else (1, 0, 0) + u = unit(cross(seed, normal)) + else: + u = unit(u) + v = unit(profile.get('v') or profile.get('y_dir') or cross(normal, u)) + return profile.get('origin', (0, 0, 0)), u, v, normal + + +def circumcenter(a, b, c): + determinant = 2 * (a[0] * (b[1] - c[1]) + b[0] * (c[1] - a[1]) + c[0] * (a[1] - b[1])) + if abs(determinant) < 1e-15: + raise ValueError('arc points are collinear') + squared = [dot(p, p) for p in (a, b, c)] + return ((squared[0] * (b[1] - c[1]) + squared[1] * (c[1] - a[1]) + squared[2] * (a[1] - b[1])) / determinant, + (squared[0] * (c[0] - b[0]) + squared[1] * (a[0] - c[0]) + squared[2] * (b[0] - a[0])) / determinant) + + +def oriented_spline(edge): + """Align basis poles with traced edge traversal before binding endpoints. + + OCCT adaptor poles retain increasing parameter order even when a wire + traverses the edge backwards. Swapping only its endpoint refs distorts + cubic and higher-order curves, so reverse the entire exact basis. + """ + poles = edge.get('poles') or edge.get('control_points') + start, end = edge.get('start'), edge.get('end') + if not poles or start is None or end is None or math.dist(start, end) < 1e-9: + return edge + if math.dist(start, poles[-1]) > 1e-7 or math.dist(end, poles[0]) > 1e-7: + return edge + changed = dict(edge, poles=list(reversed(poles))) + if edge.get('weights'): + changed['weights'] = list(reversed(edge['weights'])) + if edge.get('knots'): + total = edge['knots'][0] + edge['knots'][-1] + changed['knots'] = [total - knot for knot in reversed(edge['knots'])] + if edge.get('multiplicities'): + changed['multiplicities'] = list(reversed(edge['multiplicities'])) + return changed + + +class Sketch: + def __init__(self, name, profile): + self.name = name + self.origin, self.u, self.v, self.normal = frame(profile) + plane_expr = "{'origin': " + fmt_vec(self.origin) + ", 'x_axis': " + fmt_vec(self.u) + ", 'y_axis': " + fmt_vec(self.v) + "}" + self.lines = [f" {name} = scad.make_sketch_rsketch(name={name!r}, plane={plane_expr})"] + self.points = {} + self.counter = 0 + self.entities = 0 + self.snapshot_entities = [] + + def local(self, point): + delta = [float(x) - float(y) for x, y in zip(point, self.origin)] + if abs(dot(delta, self.normal)) > 1e-5: + raise ValueError('nonplanar curve cannot be represented by sketch') + return dot(delta, self.u), dot(delta, self.v) + + def point(self, coordinates): + key = tuple(round(x, 9) for x in coordinates) + if key not in self.points: + self.counter += 1 + point_id = f'p{self.counter}' + self.points[key] = point_id + self.lines.append(f' {self.name} = scad.add_point_rsketch(sketch={self.name}, point_id={point_id!r}, x={fmt_num(coordinates[0])}, y={fmt_num(coordinates[1])})') + self.snapshot_entities.append({'id': point_id, 'kind': 'point', 'xy': list(coordinates)}) + return self.points[key] + + def entity(self, edge): + self.entities += 1 + name = f'e{self.entities}' + prefix = f' {self.name} = scad.' + base = f'sketch={self.name}, entity_id={name!r}' + kind = edge['kind'].lower() + if kind == 'line': + a, b = self.point(self.local(edge['start'])), self.point(self.local(edge['end'])) + self.lines.append(prefix + f'add_line_rsketch({base}, start={a!r}, end={b!r})') + self.snapshot_entities.append({'id': name, 'kind': 'line', 'start': a, 'end': b}) + elif kind in ('arc', 'arc3') or (kind == 'circle' and edge.get('mid') is not None): + a, b, c = [self.local(edge[x]) for x in ('start', 'mid', 'end')] + center = circumcenter(a, b, c) + angles = [math.atan2(p[1] - center[1], p[0] - center[0]) for p in (a, b, c)] + if (angles[1] - angles[0]) % (2 * math.pi) > (angles[2] - angles[0]) % (2 * math.pi): + a, c = c, a + start, end, center_ref = self.point(a), self.point(c), self.point(center) + self.lines.append(prefix + f'add_arc_rsketch({base}, start={start!r}, end={end!r}, center={center_ref!r})') + self.snapshot_entities.append({'id': name, 'kind': 'arc', 'start': start, 'end': end, 'center': center_ref}) + elif kind == 'circle': + center = self.point(self.local(edge['center'])) + self.lines.append(prefix + f'add_circle_rsketch({base}, center={center!r}, radius={fmt_num(edge["radius"])})') + self.snapshot_entities.append({'id': name, 'kind': 'circle', 'center': center, 'radius': edge['radius']}) + elif kind == 'ellipse': + if edge.get('trimmed'): + raise ValueError('trimmed ellipse requires exact trimmed B-spline data') + center3 = edge['center'] + x_dir = edge.get('x_dir') or self.u + y_dir = edge.get('y_dir') or cross(edge.get('normal', self.normal), x_dir) + major3 = [c + edge['major_radius'] * d for c, d in zip(center3, x_dir)] + minor3 = [c + edge['minor_radius'] * d for c, d in zip(center3, y_dir)] + center, major, minor = [self.point(self.local(p)) for p in (center3, major3, minor3)] + self.lines.append(prefix + f'add_ellipse_rsketch({base}, center={center!r}, major_point={major!r}, minor_point={minor!r})') + self.snapshot_entities.append({'id': name, 'kind': 'ellipse', 'center': center, 'major_point': major, 'minor_point': minor}) + elif kind in ('bspline', 'bezier'): + edge = oriented_spline(edge) + poles = edge.get('poles') or edge.get('control_points') + if not poles: + raise ValueError('B-spline poles missing') + a = self.point(self.local(edge.get('start', poles[0]))) + b = self.point(self.local(edge.get('end', poles[-1]))) + degree = int(edge.get('degree', len(poles) - 1 if kind == 'bezier' else 3)) + knots = edge.get('knots', [0, 1] if kind == 'bezier' else None) + mults = edge.get('multiplicities', [degree + 1, degree + 1] if kind == 'bezier' else None) + self.lines.append(prefix + f'add_bspline_rsketch({base}, start={a!r}, end={b!r}, control_points={fmt_literal([self.local(p) for p in poles])}, degree={degree}, knots={fmt_literal(knots)}, multiplicities={fmt_literal(mults)}, weights={fmt_literal(edge.get("weights"))}, periodic={bool(edge.get("periodic", False))!r})') + self.snapshot_entities.append({'id': name, 'kind': 'bspline', 'start': a, 'end': b, + 'control_points': [self.local(p) for p in poles], 'degree': degree, + 'knots': knots, 'multiplicities': mults, 'weights': edge.get('weights'), 'periodic': edge.get('periodic', False)}) + else: + raise ValueError(f'unsupported exact curve kind: {kind}') + + +def emit_profile(profile: Mapping[str, Any], name: str, *, as_wire: bool = False, snapshots=None): + """Return source lines + face/wire expression; outer-first wire ordering.""" + wires = profile.get('wires') or [{'edges': profile.get('edges', [])}] + if not wires or not wires[0].get('edges'): + raise ValueError('empty profile') + if as_wire and len(wires) > 1: + raise ValueError('a wire section cannot represent multiple disconnected loops') + sketch = Sketch(name + '_sketch', profile) + profile_ids = [] + for wire in wires: + if not wire.get('edges'): + raise ValueError('empty inner profile') + profile_ids.append(f'e{sketch.entities + 1}') + for edge in wire['edges']: + sketch.entity(edge) + if snapshots is not None: + snapshots.append({'name': sketch.name, 'entities': sketch.snapshot_entities, + 'closed': wires[0].get('closed', not as_wire), + 'plane': {'origin': list(sketch.origin), 'x_axis': list(sketch.u), 'y_axis': list(sketch.v)}}) + output = name + ('_wire' if as_wire else '_face') + api = 'make_wire_from_sketch_rwire' if as_wire else 'make_face_from_sketch_rface' + outer = '0' if len(wires) == 1 else repr(profile_ids[0]) + holes = '' if len(wires) == 1 else f', inner_profiles={profile_ids[1:]!r}' + sketch.lines.append(f' {output} = scad.{api}(sketch={sketch.name}, profile={outer}{holes})') + return sketch.lines, output + + +def emit_path(path: Mapping[str, Any], name: str, *, snapshots=None): + if path.get('normal') is not None and path.get('planar', True): + return emit_profile(path, name, as_wire=True, snapshots=snapshots) + lines, edges = [], [] + path_edges = path.get('edges') or [edge for wire in path.get('wires', []) for edge in wire.get('edges', [])] + for index, edge in enumerate(path_edges): + ref = f'{name}_edge{index}' + kind = edge['kind'] + if kind == 'line': + expression = f'scad.make_line_redge(start={fmt_vec(edge["start"])}, end={fmt_vec(edge["end"])})' + elif kind in ('arc', 'arc3'): + expression = f'scad.make_three_point_arc_redge(start={fmt_vec(edge["start"])}, middle={fmt_vec(edge["mid"])}, end={fmt_vec(edge["end"])})' + elif kind == 'circle': + expression = f'scad.make_circle_redge(center={fmt_vec(edge["center"])}, radius={fmt_num(edge["radius"])}, normal={fmt_vec(edge.get("normal", (0, 0, 1)))})' + elif kind in ('bspline', 'bezier'): + edge = oriented_spline(edge) + degree = int(edge.get('degree', len(edge['poles']) - 1 if kind == 'bezier' else 3)) + expression = (f'scad.make_spline_redge(control_points={fmt_literal(edge["poles"])}, degree={degree}, ' + f'knots={fmt_literal(edge.get("knots"))}, multiplicities={fmt_literal(edge.get("multiplicities"))}, ' + f'weights={fmt_literal(edge.get("weights"))}, periodic={bool(edge.get("periodic", False))!r})') + else: + raise ValueError(f'unsupported nonplanar path curve: {kind}') + lines.append(f' {ref} = {expression}') + edges.append(ref) + if not edges: + raise ValueError('empty sweep path') + output = name + '_wire' + lines.append(f' {output} = scad.make_wire_from_edges_rwire(edges=[{", ".join(edges)}])') + return lines, output diff --git a/tools/research/build123dftc/b3ftc/replay.py b/tools/research/build123dftc/b3ftc/replay.py new file mode 100644 index 00000000..5b003bfd --- /dev/null +++ b/tools/research/build123dftc/b3ftc/replay.py @@ -0,0 +1,493 @@ +"""Translate a portable build123d operation trace into explicit FTC dataflow. + +Only recorded feature inputs are reconstructed. Unknown operations block their +own dependent chain instead of being replaced by final-result geometry. +""" +from __future__ import annotations +import math +import re +from typing import Any, Mapping +from .emit import SlugAllocator, block_header, emit_module, fingerprint_selector, fmt_literal, fmt_num, fmt_vec +from .profiles import cross, dot, emit_path, emit_profile, frame, unit + + +def _named(parameters, *names, default=None): + for name in names: + if name in parameters and parameters[name] is not None: + return parameters[name] + return default + + +def _variable(name): + return 'body_' + re.sub('[^a-zA-Z0-9_]', '_', str(name)) + + +def _axis(parameters): + value = parameters.get('axis', (0, 0, 1)) + if isinstance(value, dict): + return value.get('direction', (0, 0, 1)), value.get('origin', (0, 0, 0)) + return value, parameters.get('origin', (0, 0, 0)) + + +def _profiles(step): + profiles = step.get('profiles') or [step.get('profile')] + holes = step.get('inner_wires') or [] + if holes and len(profiles) == 1 and profiles[0]: + profile = dict(profiles[0]) + wires = list(profile.get('wires', [])) + for hole in holes: + wires.extend(hole.get('wires', [hole]) if isinstance(hole, dict) else []) + profile['wires'] = wires + profiles = [profile] + return profiles + + +def _matrix_operations(matrix): + """Decompose an affine matrix into local scale, rotation, translation.""" + if isinstance(matrix, dict): + matrix = matrix.get('matrix') + if len(matrix) == 16 and not isinstance(matrix[0], (list, tuple)): + matrix = [matrix[i:i + 4] for i in range(0, 16, 4)] + columns = [tuple(float(matrix[i][j]) for i in range(3)) for j in range(3)] + scales = [math.sqrt(dot(c, c)) for c in columns] + if min(scales) < 1e-12: + raise ValueError('singular affine transform') + axes = [tuple(x / scale for x in column) for column, scale in zip(columns, scales)] + if any(abs(dot(axes[i], axes[j])) > 1e-8 for i in range(3) for j in range(i + 1, 3)): + raise ValueError('affine shear cannot be represented by native scale/rotation') + if dot(cross(axes[0], axes[1]), axes[2]) < 0: + scales[0] = -scales[0] + axes[0] = tuple(-x for x in axes[0]) + r = [[axes[j][i] for j in range(3)] for i in range(3)] + cosine = max(-1., min(1., (r[0][0] + r[1][1] + r[2][2] - 1) / 2)) + angle = math.acos(cosine) + if angle < 1e-9: + axis = (0, 0, 1) + elif abs(angle - math.pi) < 1e-7: + diagonal = [max(0., (r[i][i] + 1) / 2) for i in range(3)] + pivot = max(range(3), key=lambda i: diagonal[i]) + axis_list = [0., 0., 0.] + axis_list[pivot] = math.sqrt(diagonal[pivot]) + for j in range(3): + if j != pivot: + axis_list[j] = (r[pivot][j] + r[j][pivot]) / (4 * axis_list[pivot]) + axis = unit(axis_list) + else: + axis = unit((r[2][1] - r[1][2], r[0][2] - r[2][0], r[1][0] - r[0][1])) + return scales, axis, math.degrees(angle), tuple(float(matrix[i][3]) for i in range(3)) + + +class TraceReplayer: + def __init__(self, trace: Mapping[str, Any], stem: str, constraints_mode: bool = False): + self.trace = trace + self.stem = stem + self.lines = [] + self.variables = {} + self.steps = {} + self.unsupported = list(trace.get('unsupported', [])) + self.slugs = SlugAllocator() + self.feature_count = 0 + self.uses_ql = False + self.snapshots = [] + self.constraints_mode = constraints_mode + self.constraint_reports = [] + + def profile(self, profile, name, as_wire=False): + if profile.get('kind') == 'vertex': + if not as_wire: + raise ValueError('vertex cannot be a solid profile') + output = name + '_vertex' + self.lines.append(f' {output} = scad.make_point_rvertex({", ".join(f"{axis}={fmt_num(x)}" for axis, x in zip("xyz", profile["point"]))})') + return output + lines, expression = emit_profile(profile, name, as_wire=as_wire, snapshots=self.snapshots) + self.lines.extend(lines) + return expression + + def source(self, step): + ids = step.get('inputs', []) + if isinstance(ids, str): + ids = [ids] + missing = [ref for ref in ids if ref not in self.variables] + if missing: + raise ValueError(f'input feature unavailable: {missing}') + return [self.variables[ref] for ref in ids] + + def build_step(self, step): + op = step['op'].lower() + p = step.get('parameters') or step.get('params') or {} + ident = step.get('id', f's{self.feature_count + 1}') + var = _variable(ident) + inputs = self.source(step) + create = op in {'box', 'cylinder', 'cone', 'sphere', 'torus', 'extrude', 'revolve', 'loft', 'sweep', 'extrude_linear', 'extrude_linear_with_rotation', 'extrude_taper', 'extrude_twist', 'extrude_until', 'sweep_multi'} + role = 'build' if create else {'union': 'add', 'fuse': 'add', 'cut': 'subtract', 'intersect': 'intersect', 'compound': 'pattern'}.get(op, 'modify') + tiers = ['profile=geometry'] if op in {'extrude', 'revolve', 'loft', 'sweep', 'extrude_linear', 'extrude_linear_with_rotation', 'torus', 'extrude_taper', 'extrude_twist', 'extrude_until', 'sweep_multi'} else [] + if op in {'sweep', 'sweep_multi'}: + tiers.append('path=geometry') + self.lines.append(block_header(self.slugs.allocate(op), role, tiers)) + if op in {'box', 'cylinder', 'cone', 'sphere', 'torus'}: + self.primitive(op, p, var) + elif op in {'extrude', 'extrude_linear'}: + profiles = _profiles(step) + if not all(profiles): + raise ValueError('extrusion profile missing') + direction = _named(p, 'direction', 'vector', 'dir', default=(0, 0, 1)) + distance = _named(p, 'distance', 'amount', 'height') + if distance is None: + distance = math.sqrt(dot(direction, direction)) + if distance < 0: + direction = [-float(x) for x in direction] + distance = -distance + refs = [self.profile(profile, f'{var}_profile{i}') for i, profile in enumerate(profiles)] + self.lines.append(f' {var} = [scad.extrude_rsolid(profile=_profile, direction={fmt_vec(direction)}, distance={fmt_num(distance)}) for _profile in [{", ".join(refs)}]]') + elif op in {'extrude_taper', 'extrude_until', 'extrude_twist', 'extrude_linear_with_rotation'}: + refs = [self.profile(profile, f'{var}_profile{i}') for i, profile in enumerate(_profiles(step))] + if op == 'extrude_taper': + vector = _named(p, 'direction', 'vector', default=(0, 0, 1)) + expression = f'scad.extrude_taper_rsolid(profile=_profile, vector={fmt_vec(vector)}, taper={fmt_num(p["taper"])}, flip_inner={bool(p.get("flip_inner", True))!r})' + elif op == 'extrude_until': + if not inputs: + raise ValueError('until extrusion target missing') + target = f'[_b for _group in [{", ".join(inputs)}] for _b in _group]' + expression = f'scad.extrude_until_rsolid(profile=_profile, target={target}, direction={fmt_vec(p.get("direction", (0, 0, 1)))}, until={str(p.get("until", "NEXT"))!r})' + else: + direction = _named(p, 'normal', 'direction', 'vector', default=(0, 0, 1)) + distance = math.sqrt(dot(direction, direction)) + expression = f'scad.twisted_sweep_rsolid(profile=_profile, distance={fmt_num(distance)}, twist_angle={fmt_num(_named(p, "angle", "twist_angle", default=0))}, axis={fmt_vec(direction)}, origin={fmt_vec(_named(p, "center", "origin", default=(0, 0, 0)))}, guide_radius=1)' + self.lines.append(f' {var} = [{expression} for _profile in [{", ".join(refs)}]]') + elif op == 'revolve': + profiles = _profiles(step) + refs = [self.profile(profile, f'{var}_profile{i}') for i, profile in enumerate(profiles)] + axis, origin = _axis(p) + angle = _named(p, 'angle', 'arc', 'revolution_arc', default=360) + if angle < 0: + angle, axis = -angle, [-float(x) for x in axis] + self.lines.append(f' {var} = [scad.revolve_rsolid(profile=_profile, axis={fmt_vec(axis)}, angle={fmt_num(angle)}, origin={fmt_vec(origin)}) for _profile in [{", ".join(refs)}]]') + elif op == 'loft': + profiles = step.get('profiles') or [] + refs = [self.profile(profile, f'{var}_section{i}', as_wire=True) for i, profile in enumerate(profiles)] + if len(refs) < 2: + raise ValueError('loft needs at least two recorded sections') + self.lines.append(f' {var} = [scad.loft_rsolid(profiles=[{", ".join(refs)}], ruled={bool(p.get("ruled", False))!r})]') + elif op in {'sweep', 'sweep_multi'}: + profiles = _profiles(step) + path = step.get('path') + if not path: + raise ValueError('sweep path missing') + path_lines, path_expr = emit_path(path, var + '_path', snapshots=self.snapshots) + self.lines.extend(path_lines) + refs = [self.profile(profile, f'{var}_profile{i}') for i, profile in enumerate(profiles)] + frenet = bool(_named(p, 'is_frenet', 'frenet', default=False)) + if op == 'sweep_multi': + binormal = p.get('binormal') + if isinstance(binormal, dict): + raise ValueError('multisection sweep binormal wire missing from portable trace') + self.lines.append(f' {var} = [scad.sweep_multisection_rsolid(profiles=[{", ".join(refs)}], path={path_expr}, is_frenet={frenet!r}, binormal={fmt_literal(binormal)})]') + else: + if p.get('mode') is not None or str(p.get('transition', 'TRANSFORMED')) != 'TRANSFORMED': + raise ValueError('sweep mode/transition needs a native advanced sweep operator') + self.lines.append(f' {var} = [scad.sweep_rsolid(profile=_profile, path={path_expr}, is_frenet={frenet!r}) for _profile in [{", ".join(refs)}]]') + elif op == 'component': + if len(inputs) != 1: + raise ValueError('component requires one parent feature') + self.lines.append(f' {var} = [{inputs[0]}[{int(p["index"])}]]') + elif op in {'compound', 'copy', 'clean'}: + self.lines.append(f' {var} = [ _b for _group in [{", ".join(inputs)}] for _b in _group ]') + elif op in {'union', 'fuse', 'cut', 'intersect'}: + if not inputs: + raise ValueError('boolean inputs missing') + if len(inputs) == 1: + self.lines.append(f' {var} = list({inputs[0]})') + elif op == 'cut': + tools = f'[_b for _group in [{", ".join(inputs[1:])}] for _b in _group]' + self.lines.append(f' {var} = [scad.cut_rsolid(_b, {tools}) for _b in {inputs[0]}]') + elif op == 'intersect': + self.lines.append(f' {var} = [scad.intersect_rsolid([{", ".join(inputs)}])]') + else: + groups = step.get('result_groups') + if groups: + values = [] + for group in groups: + group_refs = [self.variables[x] for x in group] + values.append(f'scad.union_rsolid([{", ".join(group_refs)}])' if len(group_refs) > 1 else f'{group_refs[0]}[0]') + self.lines.append(f' {var} = [{", ".join(values)}]') + elif step.get('result', {}).get('solid_count', 1) > 1: + raise ValueError('disconnected union requires recorded connected operand groups') + else: + self.lines.append(f' {var} = [scad.union_rsolid([{", ".join(inputs)}])]') + elif op in {'fillet', 'chamfer'}: + selector = fingerprint_selector(step.get('selection', []), 'edge') + self.uses_ql = True + if len(inputs) != 1: + raise ValueError('blend requires one parent feature') + if op == 'fillet': + extras = f'radius={fmt_num(p["radius"])}' + else: + extras = f'distance={fmt_num(_named(p, "length", "distance", "length1"))}' + second = _named(p, 'length2', 'distance2') + if second is not None and abs(float(second) - float(_named(p, 'length', 'distance', 'length1'))) > 1e-9: + extras += ', angle=' + fmt_num(math.degrees(math.atan2(float(second), float(_named(p, 'length', 'distance', 'length1'))))) + direction = p.get('reference_direction') + if direction is None: + if p.get('reference_directions'): + raise ValueError('per-edge chamfer reference normals vary; the native operator requires one reference direction') + raise ValueError('asymmetric chamfer requires reference-face normal') + extras += ', reference_direction=' + fmt_vec(direction) + self.lines.append(f' {var} = [scad.{op}_rsolid(solid=_b, edges={selector}, {extras}) for _b in {inputs[0]}]') + elif op == 'draft': + if len(inputs) != 1: + raise ValueError('draft requires one parent feature') + selector = fingerprint_selector(step.get('selection', []), 'face') + self.uses_ql = True + plane = p.get('neutral_plane') or p.get('plane') or {} + angle = _named(p, 'angle', 'draft_angle') + if angle is None or not isinstance(plane, dict): + raise ValueError('draft angle or neutral plane missing') + self.lines.append(f' {var} = [scad.draft_rsolid(solid=_b, faces_to_draft={selector}, angle={fmt_num(angle)}, plane_origin={fmt_vec(plane.get("origin", (0, 0, 0)))}, plane_normal={fmt_vec(plane.get("normal", (0, 0, 1)))}) for _b in {inputs[0]}]') + elif op in {'offset', 'shell'}: + if len(inputs) != 1: + raise ValueError('offset requires one parent feature') + selections = step.get('selection', []) + selector = fingerprint_selector(selections, 'face') if selections else '[]' + self.uses_ql |= bool(selections) + amount = _named(p, 'offset', 'amount', 'thickness', 'distance') + if amount is None: + raise ValueError('offset distance missing') + self.lines.append(f' {var} = [scad.offset_rsolid(solid=_b, amount={fmt_num(amount)}, openings={selector}, tolerance={fmt_num(p.get("tolerance", 1e-4))}, kind={str(p.get("kind", "ARC"))!r}) for _b in {inputs[0]}]') + elif op == 'split': + self.split(step, p, inputs, var) + elif op in {'transform', 'translate', 'rotate', 'mirror', 'scale', 'move', 'moved', 'located', 'locate', 'transform_shape', 'transform_geometry'}: + self.transform(op, p, inputs, var) + else: + raise ValueError(f'unsupported op: {op}') + self.lines.append('') + self.variables[ident] = var + self.steps[ident] = step + self.feature_count += 1 + + def primitive(self, op, p, var): + plane = p.get('plane') or {} + origin = _named(p, 'origin', 'center', default=plane.get('origin', (0, 0, 0))) + axis = _named(p, 'axis', default=plane.get('normal', (0, 0, 1))) + if isinstance(axis, dict): + origin, axis = axis.get('origin', origin), axis.get('direction', (0, 0, 1)) + x_dir = plane.get('x_dir', (1, 0, 0)) + if op == 'box': + length = _named(p, 'length', 'x', default=p.get('width')) + width = _named(p, 'width', 'y', default=p.get('height')) + height = _named(p, 'height', 'z', default=p.get('depth')) + u, v = unit(x_dir), unit(cross(unit(axis), unit(x_dir))) + bottom = [float(origin[i]) + float(length) * u[i] / 2 + float(width) * v[i] / 2 for i in range(3)] + self.lines.extend([f' with scad.SimpleWorkplane(origin=(0, 0, 0), normal={fmt_vec(axis)}, x_dir={fmt_vec(x_dir)}):', + f' {var} = [scad.make_box_rsolid(width={fmt_num(length)}, height={fmt_num(width)}, depth={fmt_num(height)}, bottom_face_center={fmt_vec([dot(bottom, u), dot(bottom, v), dot(bottom, unit(axis))])})]']) + elif op in {'cylinder', 'cone'}: + angle = _named(p, 'angle', 'arc_size', default=360) + if abs(float(angle) - 360) > 1e-9: + axis, x_dir = unit(axis), unit(x_dir) + y_dir = unit(cross(axis, x_dir)) + def world(x, y, z): + return [origin[i] + x * x_dir[i] + y * y_dir[i] + z * axis[i] for i in range(3)] + if op == 'cylinder': + radius = float(p['radius']) + theta = math.radians(float(angle)) + start, mid, end = world(radius, 0, 0), world(radius * math.cos(theta / 2), radius * math.sin(theta / 2), 0), world(radius * math.cos(theta), radius * math.sin(theta), 0) + edges = [{'kind': 'line', 'start': origin, 'end': start}, {'kind': 'arc', 'start': start, 'mid': mid, 'end': end}, {'kind': 'line', 'start': end, 'end': origin}] + profile = {'origin': origin, 'u': x_dir, 'v': y_dir, 'normal': axis, 'wires': [{'edges': edges}]} + face = self.profile(profile, var + '_sector') + self.lines.append(f' {var} = [scad.extrude_rsolid(profile={face}, direction={fmt_vec(axis)}, distance={fmt_num(p["height"])})]') + else: + bottom_radius, top_radius = float(_named(p, 'base_radius', 'radius1', 'bottom_radius')), float(_named(p, 'radius2', 'top_radius', default=0)) + points = [world(0, 0, 0), world(bottom_radius, 0, 0), world(top_radius, 0, float(p['height'])), world(0, 0, float(p['height']))] + edges = [{'kind': 'line', 'start': a, 'end': b} for a, b in zip(points, points[1:] + points[:1]) if sum((x - y) ** 2 for x, y in zip(a, b)) > 1e-20] + profile = {'origin': origin, 'u': x_dir, 'v': axis, 'normal': cross(x_dir, axis), 'wires': [{'edges': edges}]} + face = self.profile(profile, var + '_meridian') + self.lines.append(f' {var} = [scad.revolve_rsolid(profile={face}, axis={fmt_vec(axis)}, angle={fmt_num(angle)}, origin={fmt_vec(origin)})]') + return + if op == 'cylinder': + args = f'radius={fmt_num(p["radius"])}' + else: + args = f'bottom_radius={fmt_num(_named(p, "radius1", "bottom_radius", "base_radius"))}, top_radius={fmt_num(_named(p, "radius2", "top_radius", default=0))}' + self.lines.append(f' {var} = [scad.make_{op}_rsolid({args}, height={fmt_num(p["height"])}, bottom_face_center={fmt_vec(origin)}, axis={fmt_vec(axis)})]') + elif op == 'sphere': + if any(abs(float(p.get(key, default)) - default) > 1e-9 for key, default in [('angle1', -90), ('angle2', 90), ('angle3', 360)]): + radius, axis, x_dir = float(p['radius']), unit(axis), unit(x_dir) + theta1, theta2 = math.radians(float(p.get('angle1', -90))), math.radians(float(p.get('angle2', 90))) + def meridian(theta): + return [origin[i] + radius * math.cos(theta) * x_dir[i] + radius * math.sin(theta) * axis[i] for i in range(3)] + start, mid, end = meridian(theta1), meridian((theta1 + theta2) / 2), meridian(theta2) + bottom_axis = [origin[i] + radius * math.sin(theta1) * axis[i] for i in range(3)] + top_axis = [origin[i] + radius * math.sin(theta2) * axis[i] for i in range(3)] + edges = [{'kind': 'arc', 'start': start, 'mid': mid, 'end': end}] + edges.extend({'kind': 'line', 'start': a, 'end': b} for a, b in [(end, top_axis), (top_axis, bottom_axis), (bottom_axis, start)] if sum((x - y) ** 2 for x, y in zip(a, b)) > 1e-20) + profile = {'origin': origin, 'u': x_dir, 'v': axis, 'normal': cross(x_dir, axis), 'wires': [{'edges': edges}]} + face = self.profile(profile, var + '_meridian') + self.lines.append(f' {var} = [scad.revolve_rsolid(profile={face}, axis={fmt_vec(axis)}, angle={fmt_num(p.get("angle3", 360))}, origin={fmt_vec(origin)})]') + return + self.lines.append(f' {var} = [scad.make_sphere_rsolid(radius={fmt_num(p["radius"])}, center={fmt_vec(origin)})]') + else: + if abs(float(p.get('angle1', 0))) > 1e-9 or abs(float(p.get('angle2', 360)) - 360) > 1e-9: + raise ValueError('partial torus tube needs a traced meridian closure profile') + major, minor = _named(p, 'major_radius', 'radius1'), _named(p, 'minor_radius', 'radius2') + axis = unit(axis) + x_dir = unit(x_dir) + profile_origin = [o + float(major) * x for o, x in zip(origin, x_dir)] + profile = {'origin': profile_origin, 'u': x_dir, 'v': axis, 'normal': cross(x_dir, axis), + 'wires': [{'edges': [{'kind': 'circle', 'center': profile_origin, 'radius': minor}]}]} + face = self.profile(profile, var + '_meridian') + self.lines.append(f' {var} = [scad.revolve_rsolid(profile={face}, axis={fmt_vec(axis)}, angle={fmt_num(_named(p, "angle3", "angle", default=360))}, origin={fmt_vec(origin)})]') + + def transform(self, op, p, inputs, var): + if len(inputs) != 1: + raise ValueError('transform requires one parent feature') + expression = '_b' + matrix = _named(p, 'matrix', 'matrix4x4', 't_matrix', 'location', 'loc') + if matrix is None and isinstance(p.get('transform'), (dict, list, tuple)): + matrix = p['transform'] + if matrix is not None: + try: + scales, axis, angle, vector = _matrix_operations(matrix) + except ValueError as error: + if 'shear' not in str(error): + raise + raw_matrix = matrix.get('matrix') if isinstance(matrix, dict) else matrix + expression = f'scad.transform_rsolid(solid=_b, matrix={fmt_literal(raw_matrix)})' + self.lines.append(f' {var} = [{expression} for _b in {inputs[0]}]') + return + if any(abs(x - 1) > 1e-10 for x in scales): + expression = f'scad.scale_rsolid(solid={expression}, factors={fmt_vec(scales)}, center=(0, 0, 0))' + if abs(angle) > 1e-10: + expression = f'scad.rotate_shape(shape={expression}, angle={fmt_num(angle)}, axis={fmt_vec(axis)}, origin=(0, 0, 0))' + if any(abs(x) > 1e-10 for x in vector): + expression = f'scad.translate_shape(shape={expression}, vector={fmt_vec(vector)})' + elif op == 'mirror' or p.get('mirror_plane') is not None: + plane = p.get('mirror_plane') or p.get('plane') or {} + expression = f'scad.mirror_shape(shape=_b, plane_origin={fmt_vec(plane.get("origin", (0, 0, 0)))}, plane_normal={fmt_vec(plane.get("normal", (0, 0, 1)))})' + elif op == 'rotate' or p.get('angle') is not None: + axis, origin = _axis(p) + expression = f'scad.rotate_shape(shape=_b, angle={fmt_num(p["angle"])}, axis={fmt_vec(axis)}, origin={fmt_vec(origin)})' + elif op == 'scale' or p.get('method') == 'scale' or p.get('factor') is not None or p.get('factors') is not None: + factors = _named(p, 'factors', 'factor', 'scale', default=1) + if isinstance(factors, (int, float)): + factors = (factors,) * 3 + expression = f'scad.scale_rsolid(solid=_b, factors={fmt_vec(factors)}, center={fmt_vec(_named(p, "center", "about", default=(0, 0, 0)))})' + else: + vector = _named(p, 'vector', 'translation', 'offset') + if vector is None: + raise ValueError('transform has no supported parameters') + expression = f'scad.translate_shape(shape=_b, vector={fmt_vec(vector)})' + self.lines.append(f' {var} = [{expression} for _b in {inputs[0]}]') + + def split(self, step, p, inputs, var): + if len(inputs) != 1: + raise ValueError('split requires one parent feature') + plane = _named(p, 'plane', 'bisect_by', 'tool', default={}) + if not isinstance(plane, dict) or 'normal' not in plane: + raise ValueError('only planar solid splits are supported') + origin, u, v, normal = frame(plane) + source_step = self.steps[step['inputs'][0]] + bbox = source_step.get('result', {}).get('bbox') or self.trace.get('b3d_bbox') + if not bbox or len(bbox) != 6: + raise ValueError('split needs the source feature bounding box') + corners = [(x, y, z) for x in (bbox[0], bbox[3]) for y in (bbox[1], bbox[4]) for z in (bbox[2], bbox[5])] + projected = [[dot([c[i] - origin[i] for i in range(3)], axis) for c in corners] for axis in (u, v, normal)] + margin = max(math.sqrt(sum((bbox[i + 3] - bbox[i]) ** 2 for i in range(3))), 1) + center2 = [(min(a) + max(a)) / 2 for a in projected[:2]] + width, height = [max(a) - min(a) + margin * 2 for a in projected[:2]] + depth = max(abs(x) for x in projected[2]) + margin + tool_origin = [origin[i] + center2[0] * u[i] + center2[1] * v[i] for i in range(3)] + keep = str(p.get('keep', 'BOTH')).upper().split('.')[-1] + refs = [] + component_sides = step.get('result_component_sides') + ordered_sides = component_sides if keep == 'BOTH' and component_sides else ['TOP', 'BOTTOM'] + for side in ordered_sides: + label = str(side).lower() + if label not in {'top', 'bottom'}: + raise ValueError(f'unknown split component side: {side}') + sign = 1 if label == 'top' else -1 + if keep != 'BOTH' and keep != label.upper(): + continue + tool = var + '_' + label + self.lines.extend([f' with scad.SimpleWorkplane(origin={fmt_vec(tool_origin)}, normal={fmt_vec([sign * x for x in normal])}, x_dir={fmt_vec(u)}):', + f' {tool} = scad.make_box_rsolid(width={fmt_num(width)}, height={fmt_num(height)}, depth={fmt_num(depth)}, bottom_face_center=(0, 0, 0))']) + refs.append(f'scad.intersect_rsolid(_b, [{tool}])') + if not refs: + raise ValueError(f'unknown split keep mode: {keep}') + self.lines.append(f' {var} = [_piece for _b in {inputs[0]} for _piece in [{", ".join(refs)}]]') + + def replay(self): + for step in self.trace.get('steps', []): + before = len(self.lines) + before_ql = self.uses_ql + before_sketches = len(self.snapshots) + before_slugs = dict(self.slugs.counts) + try: + self.build_step(step) + for snapshot in self.snapshots[before_sketches:]: + snapshot.update({'feature_id': step.get('id'), 'op': step.get('op'), 'role': 'profile'}) + except (ValueError, KeyError, TypeError, IndexError) as error: + del self.lines[before:] + del self.snapshots[before_sketches:] + self.uses_ql = before_ql + self.slugs.counts = before_slugs + self.unsupported.append(f'{step.get("id", "?")} {step.get("op", "?")}: {error}') + requested = self.trace.get('result_refs') if 'result_refs' in self.trace else self.trace.get('results') + if requested is None: + requested = [self.trace['steps'][-1]['id']] if self.trace.get('steps') else [] + if isinstance(requested, str): + requested = [requested] + refs = [self.variables[x] for x in requested if isinstance(x, str) and x in self.variables] + missing = [x for x in requested if x not in self.variables] + if missing: + self.unsupported.append(f'final result features unavailable: {missing}') + if not refs: + self.unsupported.append('feature tree produced no solid') + if self.constraints_mode: + self.recover_constraints() + count = int(self.trace.get('solid_count') or sum(self.steps[x].get('result', {}).get('solid_count', 1) for x in requested if x in self.steps) or 1) + source = emit_module(self.stem, self.lines, refs, self.unsupported, self.uses_ql, count) + return source, {'status': 'partial' if self.unsupported else 'ok', 'feature_count': self.feature_count, + 'unsupported': self.unsupported, 'result_refs': requested, + 'notes': [], 'schema_version': '1.0', 'solid_count': count, + 'artifact_type': 'assembly' if count > 1 else 'part', + 'sketches': self.snapshots, 'sketch_count': len(self.snapshots), + 'constraint_recovery': self.constraint_reports} + + def recover_constraints(self): + """Reuse the source-agnostic CQ inference engine without changing it. + + It admits only geometry-entailed constraints whose production solver + preserves coordinates. Unsupported entity families retain geometry. + """ + import sys + from pathlib import Path + sibling = str(Path(__file__).resolve().parents[2] / 'cadqueryftc') + if sibling not in sys.path: + sys.path.insert(0, sibling) + from cqftc.constraints import emit_constraint_lines, recover_constraints_guarded + for snapshot in self.snapshots: + if any(entity['kind'] not in {'point', 'line', 'circle', 'arc'} for entity in snapshot['entities']): + self.constraint_reports.append({'name': snapshot['name'], 'status': 'unsupported', + 'reason': 'constraint recovery does not handle ellipse/B-spline entities', 'constraints': []}) + continue + try: + report = recover_constraints_guarded(snapshot, timeout=30) + except Exception as error: + report = {'status': 'error', 'reason': str(error), 'constraints': []} + report['name'] = snapshot['name'] + self.constraint_reports.append(report) + if not report.get('coords_ok'): + continue + name = snapshot['name'] + constraints = [line.replace(' s = ', f' {name} = ').replace('sketch=s,', f'sketch={name},') + for line in emit_constraint_lines(report)] + for index, line in enumerate(self.lines): + if f'sketch={name}, profile=' in line and ('make_wire_from_sketch_rwire' in line or 'make_face_from_sketch_rface' in line): + self.lines[index:index] = constraints + break + + +def replay_trace_to_ftc(trace: Any, *, stem: str = 'part', constraints_mode: bool = False): + if hasattr(trace, 'to_dict'): + trace = trace.to_dict() + if not isinstance(trace, Mapping): + raise TypeError('trace must be a portable JSON mapping') + return TraceReplayer(trace, stem, constraints_mode=constraints_mode).replay() diff --git a/tools/research/build123dftc/b3ftc/schema.py b/tools/research/build123dftc/b3ftc/schema.py new file mode 100644 index 00000000..58a7f0c9 --- /dev/null +++ b/tools/research/build123dftc/b3ftc/schema.py @@ -0,0 +1,8 @@ +"""Versioned, portable feature trace contract.""" +SCHEMA_VERSION = "1.0" + + +def empty_trace(): + return {"schema_version": SCHEMA_VERSION, "steps": [], "result_refs": [], + "b3d_status": "ok", "b3d_volume": None, "b3d_bbox": None, + "solid_count": 0, "unsupported": [], "error": ""} diff --git a/tools/research/build123dftc/b3ftc/tracer.py b/tools/research/build123dftc/b3ftc/tracer.py new file mode 100644 index 00000000..607f3194 --- /dev/null +++ b/tools/research/build123dftc/b3ftc/tracer.py @@ -0,0 +1,407 @@ +"""Execute build123d and capture the actual solid construction graph. + +Instrumentation sits at the topology API: Builder, algebra and direct topology +calls consequently share one history. Sketches are transcribed as analytic/NURBS +profiles at feature boundaries. Tracing executes Python; only trusted models +should be supplied. Patches are scoped and restored even on execution failure. +""" +from __future__ import annotations + +from contextlib import contextmanager +import functools +import hashlib +import inspect +from pathlib import Path +import sys +import threading +import traceback +from typing import Any + +from . import geometry +from .schema import SCHEMA_VERSION, empty_trace + +schema_version = SCHEMA_VERSION +_LOCK = threading.RLock() + + +class Recorder: + def __init__(self): + self.trace = empty_trace() + self.depth = 0 + self.refs: dict[int, str] = {} + self.components: dict[int, tuple[str, int, Any]] = {} + self.ref_solids: dict[str, list[Any]] = {} + self.patches: list[tuple[Any, str, Any, bool]] = [] + self.retained: list[Any] = [] + self.serial = 0 + + @staticmethod + def key(shape): + return hash(shape.wrapped) + + @staticmethod + def is_solid(shape): + return hasattr(shape, "solids") and bool(shape.solids()) + + def register(self, shape, ref): + if shape is None: + return + if isinstance(shape, (list, tuple)): + solids = [s for item in shape if item is not None for s in item.solids()] + if len(solids) == 1: + self.register(solids[0], ref) + else: + for index, solid in enumerate(solids): + self.components[self.key(solid)] = (ref, index, solid) + self.retained.append(solid.wrapped) + for item in shape: + if item is not None and len(item.solids()) == 1: + single = item.solids()[0] + if self.key(single) in self.components: + self.components[self.key(item)] = self.components[self.key(single)] + return + if not hasattr(shape, "wrapped") or shape.wrapped is None: + return + self.refs[self.key(shape)] = ref + self.retained.append(shape.wrapped) + solids = shape.solids() + if len(solids) == 1: + self.refs[self.key(solids[0])] = ref + self.retained.append(solids[0].wrapped) + elif len(solids) > 1: + for index, solid in enumerate(solids): + self.components[self.key(solid)] = (ref, index, solid) + self.retained.append(solid.wrapped) + + def emit(self, op, inputs, parameters, result, source, **extra): + import build123d as b + from OCP.TopLoc import TopLoc_Location + results = result if isinstance(result, (list, tuple)) else [result] + solids = [s for obj in results if obj is not None for s in obj.solids()] + if len(solids) > 1: + extra["result_components"] = [geometry.metrics(s) for s in solids] + if op == "union" and len(solids) > 1: + groups = [] + self.depth += 1 + try: + for output in solids: + group = [] + output_box = geometry.metrics(output)["bbox"] + for input_ref in inputs: + for operand in self.ref_solids.get(input_ref, []): + box = geometry.metrics(operand)["bbox"] + if any(box[i] < output_box[i] - 1e-5 or box[i+3] > output_box[i+3] + 1e-5 for i in range(3)): + continue + common = operand.intersect(output) + overlap = geometry.metrics(common)["volume"] if common is not None else 0. + operand_volume = geometry.metrics(operand)["volume"] + if abs(overlap - operand_volume) <= max(1e-6, abs(operand_volume) * 1e-7): + group.extend(self.reference(operand)) + groups.append(list(dict.fromkeys(group))) + finally: + self.depth -= 1 + extra["result_groups"] = groups + self.serial += 1 + ref = f"s{self.serial}" + step = {"id": ref, "op": op, "inputs": list(dict.fromkeys(inputs)), + "parameters": parameters, "source": source, + "result": geometry.metrics(result), **extra} + self.trace["steps"].append(step) + self.register(result, ref) + self.ref_solids[ref] = [b.Solid(s.wrapped.Moved(TopLoc_Location())) for s in solids] + return ref + + def unsupported(self, message, shape=None, source="unknown"): + entry = {"source": source, "reason": message} + if entry not in self.trace["unsupported"]: + self.trace["unsupported"].append(entry) + if shape is not None: + return self.emit("unsupported", [], {"reason": message}, shape, source) + return None + + def reference(self, shape): + if shape is None: + return [] + if isinstance(shape, (list, tuple)): + return [r for item in shape for r in self.reference(item)] + if hasattr(shape, "part") and not hasattr(shape, "wrapped"): + return self.reference(shape.part) + if not hasattr(shape, "wrapped") or shape.wrapped is None or not self.is_solid(shape): + return [] + key = self.key(shape) + if key in self.refs: + return [self.refs[key]] + if key in self.components: + parent, index, solid = self.components[key] + return [self.emit("component", [parent], {"index": index, "fingerprint": geometry.metrics(solid)}, solid, "Shape.solids")] + solids = shape.solids() + known = [self.refs.get(self.key(s)) for s in solids] + if all(known): + if len(set(known)) == 1: + self.register(shape, known[0]) + return [known[0]] + return [self.emit("compound", known, {}, shape, "Compound")] + if all(self.key(s) in self.refs or self.key(s) in self.components for s in solids): + children = [ref for solid in solids for ref in self.reference(solid)] + return [self.emit("compound", children, {}, shape, "Compound")] + ref = self.unsupported(f"Untraced solid construction: {type(shape).__name__}", shape) + return [ref] + + def patch(self, owner, name, replacement): + own_attribute = name in owner.__dict__ + original = inspect.getattr_static(owner, name) + self.patches.append((owner, name, original, own_attribute)) + setattr(owner, name, replacement) + + def bind(self, fn, args, kwargs): + bound = inspect.signature(fn).bind(*args, **kwargs) + bound.apply_defaults() + return dict(bound.arguments) + + def wrap(self, owner, name, op, *, factory=False): + fn = getattr(owner, name) + descriptor = inspect.getattr_static(owner, name) + + @functools.wraps(fn) + def wrapped(*args, **kwargs): + if self.depth: + return fn(*args, **kwargs) + receiver = None if factory else args[0] + if receiver is not None and not self.is_solid(receiver): + return fn(*args, **kwargs) + params = self.bind(fn, args, kwargs) + params.pop("self", None) + # Materialize iterables once: feature generators must still execute normally. + for field in ("objs", "profiles", "edge_list", "faces", "openings", "inner_wires"): + value = params.get(field) + if value is not None and not isinstance(value, (list, tuple)) and not hasattr(value, "wrapped"): + params[field] = list(value) + # Rebind the materialized values to preserve the original call contract. + bound = inspect.signature(fn).bind(*args, **kwargs) + for field, value in params.items(): + if field in bound.arguments: + bound.arguments[field] = value + inputs = self.reference(receiver) if receiver is not None else [] + extra = {} + encoded = {} + try: + for field, value in params.items(): + if field in {"obj", "profile", "section", "surface"} and op in {"extrude", "extrude_taper", "extrude_until", "revolve", "sweep", "extrude_twist", "thicken"}: + extra["profile"] = geometry.profile(value) + elif field in {"objs", "profiles"} and op in {"loft", "sweep_multi"}: + extra["profiles"] = [geometry.profile(v) for v in value] + elif field == "path" and op in {"sweep", "sweep_multi"}: + extra["path"] = geometry.path(value) + elif field in {"edge_list", "faces", "openings"}: + extra["selection"] = [geometry.fingerprint(v, receiver) for v in value or []] + elif field in {"to_fuse", "to_cut", "to_intersect", "target"}: + inputs.extend(self.reference(value)) + elif field == "inner_wires": + extra["inner_wires"] = [geometry.wire(v) for v in value or []] + else: + encoded[field] = geometry.serialize(value) + except Exception as exc: + extra["geometry_error"] = str(exc) + self.unsupported(f"Cannot transcribe {name} inputs: {exc}", source=f"{owner.__name__}.{name}") + if op == "chamfer" and params.get("length2") is not None and params["length2"] != params["length"]: + # The native kernel assigns distance1 relative to an adjacent + # face, even when no reference face is supplied by the caller. + import build123d as b + from build123d.topology.three_d import IndexedDataMap_TopoDS_Shape_List_TopoDS_Shape_TopTools_ShapeMapHasher + from OCP.TopExp import TopExp + from OCP.TopAbs import TopAbs_EDGE, TopAbs_FACE + adjacency = IndexedDataMap_TopoDS_Shape_List_TopoDS_Shape_TopTools_ShapeMapHasher() + TopExp.MapShapesAndAncestors_s(receiver.wrapped, TopAbs_EDGE, TopAbs_FACE, adjacency) + directions = [] + for selected in params["edge_list"]: + explicit = params.get("face") + reference = explicit if explicit is not None else next(face for face in receiver.faces() if face.wrapped.IsSame(adjacency.FindFromKey(selected.wrapped).First())) + direction = geometry.vector(reference.normal_at(selected.position_at(.5))) + directions.append(direction) + encoded["reference_directions"] = directions + if directions and all(sum((a-b)**2 for a,b in zip(directions[0], item)) < 1e-12 for item in directions): + encoded["reference_direction"] = directions[0] + if op == "transform": + encoded["method"] = name + if name == "scale" and params.get("about") is None: + encoded["about"] = geometry.vector(receiver.location.position) + if name == "transformed": + from OCP.gp import gp_Trsf, gp_Ax1, gp_Pnt, gp_Dir, gp_Vec + import math + rotation = params["rotate"] + if hasattr(rotation, "X"): + rotation = geometry.vector(rotation) + rotations = [] + for i, angle in enumerate(rotation): + trsf = gp_Trsf() + axis = [0., 0., 0.] + axis[i] = 1. + trsf.SetRotation(gp_Ax1(gp_Pnt(), gp_Dir(*axis)), math.radians(angle)) + rotations.append(trsf) + translation = gp_Trsf() + offset = params["offset"] + translation.SetTranslation(gp_Vec(*(geometry.vector(offset) if hasattr(offset, "X") else offset))) + transformation = translation * rotations[0] * rotations[1] * rotations[2] + encoded["matrix"] = [[float(transformation.Value(i, j)) for j in range(1, 5)] for i in range(1, 4)] + [[0., 0., 0., 1.]] + if name in {"locate", "located"}: + # Absolute location requires replacing the current shape location. + import build123d as b + loc = params["loc"] + encoded["matrix"] = geometry.location_matrix(loc * receiver.location.inverse()) + elif name in {"move", "moved"}: + loc = params["loc"] + encoded["matrix"] = geometry.location_matrix(getattr(loc, "location", loc)) + self.depth += 1 + try: + result = fn(*bound.args, **bound.kwargs) + finally: + self.depth -= 1 + if result is not None and (self.is_solid(result) if not isinstance(result, (list, tuple)) else any(self.is_solid(v) for v in result if v is not None)): + if op == "split" and isinstance(result, tuple) and len(result) == 2: + for value, keep in zip(result, ["TOP", "BOTTOM"]): + if value is not None: + self.emit(op, inputs, {**encoded, "keep": keep}, value, f"{owner.__name__}.{name}", **extra) + else: + self.emit(op, inputs, encoded, result, f"{owner.__name__}.{name}", **extra) + return result + + if isinstance(descriptor, classmethod): + # `fn` is already bound to the class; discard the newly supplied cls. + @functools.wraps(fn) + def class_wrapped(cls, *args, **kwargs): + return wrapped(*args, **kwargs) + self.patch(owner, name, classmethod(class_wrapped)) + elif isinstance(descriptor, staticmethod): + self.patch(owner, name, staticmethod(wrapped)) + else: + self.patch(owner, name, wrapped) + + def install(self): + import build123d as b + factories = {"make_box": "box", "make_cylinder": "cylinder", "make_cone": "cone", + "make_sphere": "sphere", "make_torus": "torus", "make_wedge": "wedge", + "extrude": "extrude", "extrude_taper": "extrude_taper", "extrude_until": "extrude_until", + "extrude_linear_with_rotation": "extrude_twist", "revolve": "revolve", + "make_loft": "loft", "sweep": "sweep", "sweep_multi": "sweep_multi", "thicken": "thicken"} + for name, op in factories.items(): + if hasattr(b.Solid, name): + self.wrap(b.Solid, name, op, factory=True) + for name, op in {"fuse": "union", "cut": "cut", "intersect": "intersect", "split": "split"}.items(): + self.wrap(b.Shape, name, op) + for name, op in {"fillet": "fillet", "chamfer": "chamfer", "offset_3d": "offset", "hollow": "shell", "draft": "draft"}.items(): + owner = next((c for c in b.Solid.__mro__ if name in c.__dict__), None) + if owner is not None: + self.wrap(owner, name, op) + for name in ("moved", "move", "located", "locate", "translate", "rotate", "mirror", "scale", "transformed", "transform_shape", "transform_geometry"): + self.wrap(b.Shape, name, "transform") + original_clean = b.Shape.clean + original_copy = b.Shape.__deepcopy__ + + @functools.wraps(original_copy) + def deepcopy(shape, memo): + refs = self.reference(shape) if not self.depth and self.is_solid(shape) else [] + self.depth += 1 + try: + result = original_copy(shape, memo) + finally: + self.depth -= 1 + if refs: + self.register(result, refs[0]) + return result + self.patch(b.Shape, "__deepcopy__", deepcopy) + original_location = inspect.getattr_static(b.Shape, "location") + + def set_location(shape, loc): + if self.depth or not self.is_solid(shape): + original_location.fset(shape, loc) + return + inputs = self.reference(shape) + matrix = geometry.location_matrix(loc * shape.location.inverse()) + self.depth += 1 + try: + original_location.fset(shape, loc) + finally: + self.depth -= 1 + self.emit("transform", inputs, {"method": "locate", "matrix": matrix}, shape, "Shape.location") + self.patch(b.Shape, "location", property(original_location.fget, set_location, original_location.fdel, original_location.__doc__)) + + @functools.wraps(original_clean) + def clean(shape): + refs = self.reference(shape) if not self.depth and self.is_solid(shape) else [] + self.depth += 1 + try: + result = original_clean(shape) + finally: + self.depth -= 1 + if refs: + self.register(result, refs[0]) + return result + self.patch(b.Shape, "clean", clean) + + def restore(self): + for owner, name, original, own_attribute in reversed(self.patches): + if own_attribute: + setattr(owner, name, original) + else: + delattr(owner, name) + self.patches.clear() + + +def _find_result(namespace): + from build123d import BuildPart, Shape + for name in ("result", "part", "model", "solid", "body"): + value = namespace.get(name) + if isinstance(value, BuildPart): + return value.part + if isinstance(value, Shape) and value.solids(): + return value + if isinstance(value, (list, tuple)) and any(isinstance(v, Shape) and v.solids() for v in value): + return value + for value in reversed(list(namespace.values())): + if isinstance(value, BuildPart) and value.part is not None: + return value.part + if isinstance(value, Shape) and value.solids(): + return value + return None + + +def trace_source(source: str, filename: str = "") -> dict[str, Any]: + """Execute a trusted program and return a portable feature graph.""" + with _LOCK: + recorder = Recorder() + namespace = {"__name__": "__build123d_trace__", "__file__": filename} + old_path = list(sys.path) + sys.path.insert(0, str(Path(filename).resolve().parent)) + try: + recorder.install() + try: + exec(compile(source, filename, "exec"), namespace) + except Exception: + recorder.trace["b3d_status"] = "error" + recorder.trace["error"] = traceback.format_exc() + result = _find_result(namespace) + if result is None: + recorder.trace["b3d_status"] = "error" + recorder.trace["error"] += "\nNo solid result found in model namespace" + else: + recorder.trace["result_refs"] = recorder.reference(result) + summary = geometry.metrics(result) + recorder.trace.update(b3d_volume=summary["volume"], b3d_bbox=summary["bbox"], solid_count=summary["solid_count"]) + recorder.trace["b3d_default_volume"] = summary.get("default_volume", summary["volume"]) + recorder.trace["b3d_volume_gk"] = summary["volume"] + values = result if isinstance(result, (list, tuple)) else [result] + recorder.trace["b3d_valid"] = all(v.is_valid for v in values) + recorder.trace["b3d_area"] = summary["area"] + finally: + recorder.restore() + sys.path[:] = old_path + recorder.trace["source_file"] = filename + recorder.trace["source_sha256"] = hashlib.sha256(source.encode("utf-8")).hexdigest() + import build123d + recorder.trace["build123d_version"] = getattr(build123d, "__version__", "unknown") + return recorder.trace + + +def trace_file(path: str | Path) -> dict[str, Any]: + path = Path(path).resolve() + return trace_source(path.read_text(encoding="utf-8"), str(path)) diff --git a/tools/research/build123dftc/b3ftc/validation.py b/tools/research/build123dftc/b3ftc/validation.py new file mode 100644 index 00000000..32720242 --- /dev/null +++ b/tools/research/build123dftc/b3ftc/validation.py @@ -0,0 +1,314 @@ +"""Stage 3 acceptance, independent of the source CAD interpreter. + +Each generated program runs in a separate process. Acceptance requires all +source metrics, complete translation, real nonempty valid solids, and matching +volume, absolute bounds and solid count. Optional STEP comparison checks both +directions of the geometric difference. +""" +from __future__ import annotations + +import json +import math +import os +from pathlib import Path +import signal +import subprocess +import sys +import tempfile +import time +from typing import Any, Mapping + +VOLUME_RTOL = 1e-3 +VOLUME_ATOL = 1e-6 +BBOX_RTOL = 1e-3 +BBOX_ATOL = 1e-4 +DIFFERENCE_RTOL = 1e-3 + + +def _finite_number(value: Any) -> bool: + return isinstance(value, (int, float)) and not isinstance(value, bool) and math.isfinite(value) + + +def _bbox(value: Any) -> bool: + return (isinstance(value, (list, tuple)) and len(value) == 6 + and all(_finite_number(v) for v in value) + and all(value[i] <= value[i + 3] for i in range(3))) + + +def _positive_count(value: Any) -> bool: + return isinstance(value, int) and not isinstance(value, bool) and value > 0 + + +def _translation_notes(payload: Mapping[str, Any]) -> bool: + return any(bool(value) for name, value in payload.items() + if name in {"unsupported", "untranslated", "unhandled"} or name.startswith("unknown")) + + +def compare_metrics(trace: Mapping[str, Any], actual: Mapping[str, Any], + meta: Mapping[str, Any] | None, *, + volume_rtol: float = VOLUME_RTOL, volume_atol: float = VOLUME_ATOL, + bbox_rtol: float = BBOX_RTOL, bbox_atol: float = BBOX_ATOL, + difference_rtol: float = DIFFERENCE_RTOL, + require_reference: bool = False) -> dict[str, Any]: + """Compare untrusted JSON evidence; missing metrics always reject.""" + reasons: list[str] = [] + if trace.get("b3d_status") != "ok": + reasons.append("source_failed") + expected_volume, expected_bbox = trace.get("b3d_volume"), trace.get("b3d_bbox") + expected_count = trace.get("solid_count") + valid_source = (_finite_number(expected_volume) and expected_volume > 0 + and _bbox(expected_bbox) and _positive_count(expected_count) + and bool(trace.get("result_refs"))) + if not valid_source: + reasons.append("missing_source_metrics") + if trace.get("b3d_valid") is False or trace.get("b3d_is_valid") is False: + reasons.append("invalid_source") + if _translation_notes(trace): + reasons.append("unsupported_source") + if not isinstance(meta, Mapping) or meta.get("status") != "ok": + reasons.append("incomplete_translation") + if isinstance(meta, Mapping) and _translation_notes(meta): + reasons.append("untranslated_operations") + if actual.get("status") != "ok": + reasons.append("build_failed") + if not _positive_count(actual.get("body_count")): + reasons.append("empty_bodies") + if actual.get("is_valid") is not True: + reasons.append("invalid_topology") + volume, bounds, count = actual.get("volume"), actual.get("bbox"), actual.get("solid_count") + valid_actual = (_finite_number(volume) and volume > 0 and _bbox(bounds) + and _positive_count(count)) + if not valid_actual: + reasons.append("missing_actual_metrics") + volume_error = bbox_error = bbox_absolute_error = area_error = None + if valid_source and valid_actual: + volume_error = abs(volume - expected_volume) / abs(expected_volume) + if abs(volume - expected_volume) > volume_atol + volume_rtol * abs(expected_volume): + reasons.append("volume_mismatch") + # Six world coordinates, scaled by axis span (never by world position). + # A rigid translation therefore fails even when every extent matches. + spans = [max(expected_bbox[i + 3] - expected_bbox[i], 1.0) for i in range(3)] + deviations = [abs(a - b) for a, b in zip(bounds, expected_bbox)] + bbox_absolute_error = max(deviations) + bbox_error = max(delta / spans[i % 3] for i, delta in enumerate(deviations)) + if any(delta > bbox_atol + bbox_rtol * spans[i % 3] + for i, delta in enumerate(deviations)): + reasons.append("bbox_mismatch") + if count != expected_count: + reasons.append("solid_count_mismatch") + expected_area, area = trace.get("b3d_area"), actual.get("area") + if expected_area is not None: + if not (_finite_number(expected_area) and expected_area > 0 and _finite_number(area) and area > 0): + reasons.append("missing_area_metrics") + else: + area_error = abs(area - expected_area) / expected_area + if abs(area - expected_area) > volume_atol + volume_rtol * abs(expected_area): + reasons.append("area_mismatch") + difference = actual.get("symmetric_difference_volume") + difference_error = None + if require_reference: + reference_volume = actual.get("reference_volume") + if (actual.get("reference_status") != "ok" or not _finite_number(difference) + or difference < 0 or not _finite_number(reference_volume) or reference_volume <= 0): + reasons.append("reference_error") + else: + difference_error = difference / reference_volume + if difference > volume_atol + difference_rtol * reference_volume: + reasons.append("symmetric_difference_mismatch") + if "roundtrip_actual_volume" in actual: + exported = {"status": "ok", "volume": actual.get("roundtrip_actual_volume"), + "bbox": actual.get("roundtrip_actual_bbox"), + "solid_count": actual.get("roundtrip_actual_solid_count"), + "body_count": actual.get("body_count"), + "is_valid": actual.get("roundtrip_actual_valid")} + original = {"b3d_status": "ok", "b3d_volume": volume, "b3d_bbox": bounds, + "solid_count": count, "result_refs": ["actual"]} + check = compare_metrics(original, exported, {"status": "ok"}, + volume_rtol=volume_rtol, volume_atol=volume_atol, + bbox_rtol=bbox_rtol, bbox_atol=bbox_atol) + if check["quality"] != "accepted": + reasons.append("reference_roundtrip_changed_geometry") + return { + "quality": "rejected" if reasons else "accepted", "reasons": reasons, + "b3d_volume": expected_volume if _finite_number(expected_volume) else None, + "ftc_volume": volume if _finite_number(volume) else None, + "b3d_bbox": expected_bbox if _bbox(expected_bbox) else None, + "ftc_bbox": bounds if _bbox(bounds) else None, + "b3d_solid_count": expected_count, "ftc_solid_count": count, + "body_count": actual.get("body_count"), "is_valid": actual.get("is_valid"), + "volume_error": volume_error, "bbox_error": bbox_error, + "b3d_area": expected_area if _finite_number(expected_area) else None, + "ftc_area": area if _finite_number(area) else None, + "area_error": area_error, + "bbox_absolute_error": bbox_absolute_error, + "symmetric_difference_volume": difference if _finite_number(difference) else None, + "symmetric_difference_error": difference_error, + } + + +def _load_json(path: Path) -> dict[str, Any]: + payload = json.loads(path.read_text(encoding="utf-8")) + if not isinstance(payload, dict): + raise ValueError(f"JSON root must be an object: {path}") + return payload + + +def _interpreter(executable: str | None) -> str: + executable = executable or sys.executable + # Keep a venv symlink instead of resolving it to the base Python binary. + return os.path.abspath(executable) if os.sep in executable else executable + + +def _process(command: list[str], staging: Path, env: Mapping[str, str], + output: Path, timeout: float) -> dict[str, Any]: + if timeout <= 0: + return {"status": "timeout", "error": "case timeout exhausted before reference comparison"} + process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + text=True, cwd=staging, env=env, + start_new_session=os.name == "posix") + try: + stdout, stderr = process.communicate(timeout=timeout) + except subprocess.TimeoutExpired: + if os.name == "posix": + try: + os.killpg(process.pid, signal.SIGKILL) + except ProcessLookupError: + pass + else: + process.kill() + stdout, stderr = process.communicate() + return {"status": "timeout", "error": f"build exceeded {timeout:g} seconds", + "stdout": stdout[-4000:], "stderr": stderr[-4000:]} + if output.exists(): + try: + result = _load_json(output) + except (ValueError, OSError) as exc: + result = {"status": "worker_error", "error": str(exc)} + else: + result = {"status": "worker_error", "error": f"worker exited {process.returncode} without metrics"} + if process.returncode and result.get("status") == "ok": + result.update(status="worker_error", error=f"worker exited {process.returncode}") + if stdout.strip(): + result["stdout"] = stdout[-4000:] + if stderr.strip(): + result["stderr"] = stderr[-4000:] + return result + + +def _worker(ftc_path: Path, workdir: Path | None, timeout: float, + reference_step: Path | None, python_executable: str | None, + reference_python: str | None = None, + export_options: Mapping[str, Any] | None = None) -> dict[str, Any]: + if timeout <= 0 or not math.isfinite(timeout): + raise ValueError("timeout must be a positive finite number") + if workdir is not None: + workdir.mkdir(parents=True, exist_ok=True) + tool_dir = Path(__file__).resolve().parent.parent + repo_root = tool_dir.parents[2] + with tempfile.TemporaryDirectory(prefix="b3ftc-validate-", dir=workdir) as tmp: + staging = Path(tmp).resolve() + output = staging / "result.json" + command = [_interpreter(python_executable), str(tool_dir / "b3ftc/_validate_worker.py"), + "--ftc", str(ftc_path.resolve()), "--output", str(output), + "--staging-dir", str(staging)] + actual_step = staging / "actual.step" + if reference_step is not None and reference_python is not None: + command.extend(["--export-step", str(actual_step)]) + if export_options: + command.extend(["--export-options", json.dumps(export_options)]) + elif reference_step is not None: + command.extend(["--reference-step", str(reference_step.resolve())]) + env = os.environ.copy() + env["PYTHONPATH"] = os.pathsep.join([str(repo_root / "src"), str(tool_dir), + env.get("PYTHONPATH", "")]) + started = time.monotonic() + result = _process(command, staging, env, output, timeout) + if reference_python is not None and reference_step is not None and result.get("status") == "ok": + ref_output = staging / "reference.json" + command = [_interpreter(reference_python), str(tool_dir / "b3ftc/_reference_worker.py"), + "--actual-step", str(actual_step), "--reference-step", str(reference_step.resolve()), + "--output", str(ref_output)] + ref = _process(command, staging, env, ref_output, timeout - (time.monotonic() - started)) + result.update({key: value for key, value in ref.items() + if key.startswith(("reference_", "roundtrip_actual_", "symmetric_difference_"))}) + if ref.get("status") != "ok": + result.update(reference_status="error", reference_error=ref.get("reference_error", ref.get("error", ""))) + return result + + +def validate_row(ftc_path: Path, trace_path: Path, workdir: Path | None = None, *, + timeout: float = 120, reference_step: Path | None = None, + python_executable: str | None = None, + reference_python: str | None = None) -> dict[str, Any]: + """Validate one FTC. Errors are returned as rejected rows for batch use.""" + ftc_path, trace_path = Path(ftc_path), Path(trace_path) + stem = ftc_path.name.removesuffix(".ftc.py") + row: dict[str, Any] = {"stem": stem, "quality": "rejected", "metrics_quality": "rejected", "metrics_reasons": ["not_evaluated"]} + try: + if not ftc_path.is_file(): + return {**row, "build": "missing_ftc", "reasons": ["missing_ftc"]} + if not trace_path.is_file(): + return {**row, "build": "missing_trace", "reasons": ["missing_trace"]} + trace = _load_json(trace_path) + meta_path = ftc_path.with_name(stem + ".meta.json") + meta = _load_json(meta_path) if meta_path.is_file() else None + # Reject absent/failed source or incomplete conversion without executing it. + preliminary = compare_metrics(trace, {}, meta) + source_reasons = [reason for reason in preliminary["reasons"] if reason in { + "source_failed", "missing_source_metrics", "invalid_source", "unsupported_source", + "incomplete_translation", "untranslated_operations"}] + if source_reasons: + return {**row, **preliminary, "build": "not_run", "reasons": source_reasons, + "error": trace.get("error", "")} + metadata = trace.get("source_metadata") or {} + export_options = metadata.get("export_options", trace.get("export_options")) + metrics = _worker(ftc_path, Path(workdir) if workdir is not None else None, + timeout, Path(reference_step) if reference_step is not None else None, + python_executable, reference_python, export_options) + result = compare_metrics(trace, metrics, meta, require_reference=reference_step is not None) + basic = compare_metrics(trace, metrics, meta, require_reference=False) + return {**row, **result, "build": metrics.get("status", "worker_error"), + "metrics_quality": basic["quality"], "metrics_reasons": basic["reasons"], + "error": metrics.get("error", ""), + "reference_status": metrics.get("reference_status"), + "reference_kernel": metrics.get("reference_kernel"), + "reference_export_options": metrics.get("reference_export_options"), + "reference_boolean_fuzzy_tolerance": metrics.get("reference_boolean_fuzzy_tolerance"), + "reference_python": reference_python, + "build_kernel": metrics.get("build_kernel"), + "volume_method": metrics.get("volume_method"), + "area_method": metrics.get("area_method"), + "reference_error": metrics.get("reference_error", ""), + "stdout": metrics.get("stdout", ""), "stderr": metrics.get("stderr", "")} + except Exception as exc: + return {**row, "build": "validator_error", "reasons": ["validator_error"], + "error": f"{type(exc).__name__}: {exc}"} + + +def validate_directory(ftc_dir: Path, traces_dir: Path, *, timeout: float = 120, + reference_step_dir: Path | None = None, limit: int | None = None, + python_executable: str | None = None, + reference_python: str | None = None) -> dict[str, Any]: + """Check the union of FTC and trace stems, never omit a failed conversion.""" + ftc_dir, traces_dir = Path(ftc_dir), Path(traces_dir) + stems = sorted({path.name.removesuffix(".ftc.py") for path in ftc_dir.glob("*.ftc.py")} + | {path.name.removesuffix(".trace.json") for path in traces_dir.glob("*.trace.json")}) + if limit is not None: + if limit < 0: + raise ValueError("limit must be nonnegative") + stems = stems[:limit] + rows = [validate_row(ftc_dir / (stem + ".ftc.py"), traces_dir / (stem + ".trace.json"), + timeout=timeout, python_executable=python_executable, + reference_python=reference_python, + reference_step=(Path(reference_step_dir) / (stem + ".step")) + if reference_step_dir is not None else None) for stem in stems] + return {"schema_version": "1.0", "rows": rows, + "counts": {quality: sum(row["quality"] == quality for row in rows) + for quality in ("accepted", "partial", "rejected")}, + "tolerances": {"volume_relative": VOLUME_RTOL, "volume_absolute": VOLUME_ATOL, + "bbox_relative_to_axis_span": BBOX_RTOL, "bbox_absolute": BBOX_ATOL, + "symmetric_difference_relative": DIFFERENCE_RTOL}, + "volume_method": "Gauss-Kronrod, epsilon=1e-9, closed shells, BSpline spans", + "area_method": "Independent geometry copy, C1 continuity spans, adaptive epsilon=1e-10", + "reference_step_dir": str(reference_step_dir) if reference_step_dir else None, + "reference_python": reference_python} diff --git a/tools/research/build123dftc/build123d_profile.py b/tools/research/build123dftc/build123d_profile.py new file mode 100644 index 00000000..52467f1e --- /dev/null +++ b/tools/research/build123dftc/build123d_profile.py @@ -0,0 +1,44 @@ +"""Stage 4: count actual traced operations and report conversion gaps.""" +import argparse +from collections import Counter +import json +from pathlib import Path + + +def profile_traces(paths): + operations, sources, unsupported = Counter(), Counter(), Counter() + rows = [] + for path in paths: + trace = json.loads(Path(path).read_text(encoding="utf-8")) + for step in trace.get("steps", []): + operations[step["op"]] += 1 + sources[step.get("source", step["op"])] += 1 + for note in trace.get("unsupported", []): + unsupported[note.get("reason", str(note)) if isinstance(note, dict) else str(note)] += 1 + rows.append({"stem": trace.get("stem", Path(path).name.removesuffix(".trace.json")), + "status": trace.get("b3d_status"), "steps": len(trace.get("steps", [])), + "unsupported": len(trace.get("unsupported", []))}) + return {"model_count": len(rows), "operations": dict(operations.most_common()), + "source_methods": dict(sources.most_common()), "unsupported": dict(unsupported.most_common()), "rows": rows} + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--traces-dir", required=True) + parser.add_argument("--report") + args = parser.parse_args(argv) + paths = sorted(Path(args.traces_dir).glob("*.trace.json")) + if not paths: + parser.error("no traces found") + report = profile_traces(paths) + text = json.dumps(report, ensure_ascii=False, indent=2) + "\n" + if args.report: + path = Path(args.report) + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(text, encoding="utf-8") + print(text) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/research/build123dftc/build123d_to_ftc.py b/tools/research/build123dftc/build123d_to_ftc.py new file mode 100644 index 00000000..0ae979a5 --- /dev/null +++ b/tools/research/build123dftc/build123d_to_ftc.py @@ -0,0 +1,66 @@ +"""Stage 2: translate portable build123d traces into native FTC Python.""" +from __future__ import annotations + +import argparse +import json +from pathlib import Path +import sys + +sys.path.insert(0, str(Path(__file__).resolve().parent)) + + +def safe_stem(stem): + if not isinstance(stem, str) or stem in ("", ".", "..") or any(c in stem for c in ("/", "\\", "\x00", "\n", "\r")): + raise ValueError("stem must be a single nonempty filename") + return stem + + +def translate_trace_file(trace_path: Path, out_dir: Path, *, constraints_mode=False): + from b3ftc.replay import replay_trace_to_ftc + from b3ftc.schema import SCHEMA_VERSION + payload = json.loads(trace_path.read_text(encoding="utf-8")) + stem = safe_stem(payload.get("stem", trace_path.name.removesuffix(".trace.json"))) + if payload.get("schema_version") != SCHEMA_VERSION: + raise ValueError(f"unsupported trace schema: {payload.get('schema_version')!r}") + options = {"constraints_mode": True} if constraints_mode else {} + source, meta = replay_trace_to_ftc(payload, stem=stem, **options) + meta = {"stem": stem, "source_file": payload.get("source_file"), **meta} + snapshots = meta.pop("sketches", []) + out_dir.mkdir(parents=True, exist_ok=True) + (out_dir / f"{stem}.ftc.py").write_text(source, encoding="utf-8") + (out_dir / f"{stem}.meta.json").write_text(json.dumps(meta, ensure_ascii=False, indent=2, allow_nan=False) + "\n", encoding="utf-8") + (out_dir / f"{stem}.sketches.json").write_text(json.dumps({"stem": stem, "constraints_mode": constraints_mode, "sketches": snapshots}, + ensure_ascii=False, indent=2, allow_nan=False) + "\n", encoding="utf-8") + return stem, source, meta + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + inputs = parser.add_mutually_exclusive_group(required=True) + inputs.add_argument("--trace") + inputs.add_argument("--traces-dir") + parser.add_argument("--out", default="tools/research/build123dftc/out/ftc") + parser.add_argument("--constraints", choices=("on", "off"), default="off", help="recover inferred constraints with the existing CQ engine") + args = parser.parse_args(argv) + paths = [Path(args.trace)] if args.trace else sorted(Path(args.traces_dir).glob("*.trace.json")) + if not paths: + parser.error("no traces found") + failed = 0 + for path in paths: + try: + stem, source, meta = translate_trace_file(path, Path(args.out), constraints_mode=args.constraints == "on") + failed += meta["status"] != "ok" + print(f"{stem}: {meta['status']} ({meta.get('feature_count', 0)} features, {len(meta.get('unsupported', []))} unsupported)", flush=True) + except Exception as error: + failed += 1 + stem = safe_stem(path.name.removesuffix(".trace.json")) + out = Path(args.out) + out.mkdir(parents=True, exist_ok=True) + (out / f"{stem}.meta.json").write_text(json.dumps({"stem": stem, "status": "error", "unsupported": [f"{type(error).__name__}: {error}"]}, indent=2) + "\n") + print(f"{stem}: translation_error: {type(error).__name__}: {error}", flush=True) + print(f"translated {len(paths)} traces, {failed} incomplete -> {args.out}") + return 1 if failed else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/research/build123dftc/build123d_trace.py b/tools/research/build123dftc/build123d_trace.py new file mode 100644 index 00000000..23c1f078 --- /dev/null +++ b/tools/research/build123dftc/build123d_trace.py @@ -0,0 +1,121 @@ +"""Stage 1: execute trusted build123d models in isolated worker processes.""" +from __future__ import annotations + +import argparse +import json +import math +import os +from pathlib import Path +import signal +import subprocess +import sys + +TOOLS = Path(__file__).resolve().parent +sys.path.insert(0, str(TOOLS)) +from b3ftc.schema import empty_trace + + +def discover_inputs(*, input_file=None, inputs_dir=None, manifest=None): + if input_file: + paths = [Path(input_file).resolve()] + elif manifest: + path = Path(manifest).resolve() + payload = json.loads(path.read_text(encoding="utf-8")) + paths = [(path.parent / item["file"]).resolve() for item in payload["examples"]] + elif inputs_dir: + paths = sorted(Path(inputs_dir).resolve().glob("*.py")) + else: + raise ValueError("one input source is required") + if not paths: + raise ValueError("no Python models found") + if any(not p.is_file() for p in paths): + raise FileNotFoundError("some declared model files do not exist") + stems = [p.stem for p in paths] + if len(set(stems)) != len(stems): + raise ValueError("model stems must be unique within one batch") + return paths + + +def trace_model(path: Path, out_dir: Path, *, stem=None, timeout=120, python_executable=None, source_metadata=None): + from build123d_to_ftc import safe_stem + if not math.isfinite(timeout) or timeout <= 0: + raise ValueError("timeout must be finite and positive") + path = path.resolve() + stem = safe_stem(stem or path.stem) + out_dir.mkdir(parents=True, exist_ok=True) + output = out_dir / f"{stem}.trace.json" + temporary = out_dir / f"{stem}.trace.tmp.json" + log_path = out_dir / f"{stem}.trace.log" + temporary.unlink(missing_ok=True) + command = [python_executable or sys.executable, str(TOOLS / "b3ftc/_trace_worker.py"), + str(path), str(temporary.resolve())] + with log_path.open("w", encoding="utf-8") as log: + process = subprocess.Popen(command, stdout=log, stderr=log, cwd=path.parent, + start_new_session=True) + try: + code = process.wait(timeout=timeout) + failure = f"trace worker exited with code {code}" if code else "" + except subprocess.TimeoutExpired: + if os.name == "posix": + try: + os.killpg(process.pid, signal.SIGKILL) + except ProcessLookupError: + pass + else: + process.kill() + process.wait() + failure = f"source execution timed out after {timeout}s" + if failure or not temporary.exists(): + payload = empty_trace() + payload.update(b3d_status="error", source_file=str(path), error=failure or "worker produced no trace") + with log_path.open("rb") as log: + log.seek(max(0, log_path.stat().st_size - 4096)) + payload["error"] += "\n" + log.read().decode("utf-8", errors="replace") + else: + payload = json.loads(temporary.read_text(encoding="utf-8")) + payload["stem"] = stem + if source_metadata: + payload["source_metadata"] = source_metadata + temporary.write_text(json.dumps(payload, ensure_ascii=False, indent=2, allow_nan=False) + "\n", encoding="utf-8") + temporary.replace(output) + return payload + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + inputs = parser.add_mutually_exclusive_group(required=True) + inputs.add_argument("--input", dest="input_file", help="one trusted Python source") + inputs.add_argument("--inputs-dir", "--dataset", dest="inputs_dir", help="directory of Python models") + inputs.add_argument("--manifest", help="JSON examples manifest, paths relative to manifest") + parser.add_argument("--out", default="tools/research/build123dftc/out/traces") + parser.add_argument("--stem", help="output stem for one source") + parser.add_argument("--timeout", type=float, default=120) + parser.add_argument("--limit", type=int) + parser.add_argument("--python", dest="python_executable", help="interpreter with build123d installed") + args = parser.parse_args(argv) + if not math.isfinite(args.timeout) or args.timeout <= 0 or (args.limit is not None and args.limit <= 0): + parser.error("timeout and limit must be positive") + if args.stem and not args.input_file: + parser.error("--stem requires --input") + paths = discover_inputs(input_file=args.input_file, inputs_dir=args.inputs_dir, manifest=args.manifest) + metadata = {} + if args.manifest: + manifest_path = Path(args.manifest).resolve() + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + metadata = {str((manifest_path.parent / row["file"]).resolve()): + {key: row[key] for key in ("source_url", "source_sha256", "export_options") if key in row} + for row in manifest["examples"]} + paths = paths[:args.limit] if args.limit else paths + failed = 0 + for path in paths: + row = trace_model(path, Path(args.out), stem=args.stem, timeout=args.timeout, + python_executable=args.python_executable, source_metadata=metadata.get(str(path))) + failed += row["b3d_status"] != "ok" + print(f"{row['stem']}: {row['b3d_status']} ({len(row['steps'])} operations, " + f"{len(row['unsupported'])} unsupported)", flush=True) + print(f"captured {len(paths)} models, {failed} failed -> {args.out}") + return 1 if failed else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/research/build123dftc/build123d_validate.py b/tools/research/build123dftc/build123d_validate.py new file mode 100644 index 00000000..c0632463 --- /dev/null +++ b/tools/research/build123dftc/build123d_validate.py @@ -0,0 +1,45 @@ +"""Stage 3 — validate generated FTC solids against source traces and optional STEP.""" +from __future__ import annotations + +import argparse +import json +import math +from pathlib import Path + +from b3ftc.validation import validate_directory + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--ftc-dir", type=Path, required=True) + parser.add_argument("--traces-dir", type=Path, required=True) + parser.add_argument("--report", type=Path) + parser.add_argument("--timeout", type=float, default=120) + parser.add_argument("--reference-step-dir", type=Path) + parser.add_argument("--reference-python", help="Optional independent OCCT interpreter for STEP differences") + parser.add_argument("--limit", type=int) + parser.add_argument("--python", dest="python_executable", help="SimpleCADAPI worker interpreter") + args = parser.parse_args(argv) + if not args.ftc_dir.is_dir() or not args.traces_dir.is_dir(): + parser.error("--ftc-dir and --traces-dir must be existing directories") + if not math.isfinite(args.timeout) or args.timeout <= 0: + parser.error("--timeout must be positive and finite") + if args.limit is not None and args.limit < 0: + parser.error("--limit must be nonnegative") + if args.reference_python and not args.reference_step_dir: + parser.error("--reference-python requires --reference-step-dir") + report = validate_directory(args.ftc_dir, args.traces_dir, timeout=args.timeout, + reference_step_dir=args.reference_step_dir, limit=args.limit, + python_executable=args.python_executable, + reference_python=args.reference_python) + for row in report["rows"]: + print(f"{row['stem']}: {row['quality']} (build={row['build']}, reasons={','.join(row['reasons']) or 'none'})") + print(json.dumps(report["counts"])) + if args.report is not None: + args.report.parent.mkdir(parents=True, exist_ok=True) + args.report.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n") + return 0 if report["rows"] and not (report["counts"]["rejected"] or report["counts"]["partial"]) else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/research/build123dftc/research/inspect_api.py b/tools/research/build123dftc/research/inspect_api.py new file mode 100644 index 00000000..7fc65ac4 --- /dev/null +++ b/tools/research/build123dftc/research/inspect_api.py @@ -0,0 +1,328 @@ +"""Generate a version-specific public build123d API and corpus inventory. + +This is research evidence, not a declaration that conversion is implemented. +Run with the same interpreter as the source model corpus. +""" + +from __future__ import annotations + +import argparse +import ast +from collections import Counter +from enum import Enum +import inspect +import hashlib +import json +from pathlib import Path +from typing import Any + + +DOCUMENTATION_SOURCES = [ + "https://build123d.readthedocs.io/en/v0.13.0/objects.html", + "https://build123d.readthedocs.io/en/v0.13.0/operations.html", + "https://build123d.readthedocs.io/en/v0.13.0/key_concepts_builder.html", + "https://build123d.readthedocs.io/en/v0.13.0/key_concepts_algebra.html", + "https://build123d.readthedocs.io/en/v0.13.0/direct_api_reference.html", +] + +OPERATORS = { + "__add__", "__radd__", "__sub__", "__and__", "__mul__", "__rmul__", + "__matmul__", "__xor__", "__mod__", "__neg__", "__invert__", +} +TRANSFORMS = { + "move", "moved", "locate", "located", "translate", "rotate", "scale", + "mirror", "transform_shape", "transform_geometry", "transformed", +} +FEATURES = { + "extrude", "extrude_taper", "extrude_until", "extrude_linear_with_rotation", + "revolve", "sweep", "sweep_multi", "loft", "fillet", "chamfer", "draft", + "hollow", "offset", "offset_2d", "offset_3d", "split", "split_by_perimeter", + "thicken", "dprism", "trim", "trim_infinite", "trim_to_length", + "trim_to_other", "make_holes", "without_holes", "close", "stitch", "combine", + "clean", "fix", "fix_degenerate_edges", "to_splines", "reversed", "wrap", + "wrap_faces", "cut", "fuse", "intersect", "fillet_2d", "chamfer_2d", + "project", "project_to_shape", "project_faces", "sew_faces", +} + + +def category(name: str, obj: Any) -> str: + module = getattr(obj, "__module__", "") + if inspect.isclass(obj) and issubclass(obj, Enum): + return "enum" + if module.startswith("build123d.operations_"): + return "operation" + if module.startswith("build123d.objects_"): + return "object_" + module.removeprefix("build123d.objects_") + if name.startswith("Build"): + return "builder" + if name.endswith("Locations") or name == "Locations": + return "locations" + if module.startswith("build123d.topology"): + return "direct_topology" + if module == "build123d.geometry": + return "geometry" + if "export" in module or name.startswith("Export"): + return "export" + if "import" in module or name.startswith("import_"): + return "import" + if module == "build123d.joints": + return "assembly_joint" + if module == "build123d.drafting": + return "drawing_object" + if not callable(obj): + return "constant_or_type_alias" + return "utility" + + +def source_info(obj: Any, package_dir: Path) -> dict[str, Any]: + result: dict[str, Any] = {} + try: + source = Path(inspect.getsourcefile(obj) or "") + result["source_file"] = str(source.relative_to(package_dir.parent)) + result["source_line"] = inspect.getsourcelines(obj)[1] + except (TypeError, ValueError, OSError): + pass + try: + result["signature"] = str(inspect.signature(obj)) + except (TypeError, ValueError): + pass + return result + + +def member_category(name: str, raw: Any, owner: type) -> str: + if isinstance(raw, property): + return "property" + if name in OPERATORS: + return "algebra_operator" + if name in TRANSFORMS: + return "transform" + if name.startswith("make_") or name == "from_bounding_box": + return "factory" + if name in FEATURES: + return "feature" + if name in {"__enter__", "__exit__"}: + return "context_lifecycle" + if issubclass(owner, Enum): + return "enum_member" + return "query_or_utility" + + +class ModelVisitor(ast.NodeVisitor): + """Count modeling calls, excluding entrypoint and constant-false docs branches.""" + + def __init__(self, exports: set[str]): + self.exports = exports + self.constants: dict[str, Any] = {} + self.calls: Counter[str] = Counter() + self.methods: Counter[str] = Counter() + self.operators: Counter[str] = Counter() + self.builders = False + self.aliases = {"build123d"} + + def visit_Import(self, node: ast.Import) -> None: + for alias in node.names: + if alias.name == "build123d": + self.aliases.add(alias.asname or alias.name) + + def visit_Assign(self, node: ast.Assign) -> None: + if isinstance(node.value, ast.Constant): + for target in node.targets: + if isinstance(target, ast.Name): + self.constants[target.id] = node.value.value + self.generic_visit(node) + + def visit_If(self, node: ast.If) -> None: + test = node.test + is_entrypoint = ( + isinstance(test, ast.Compare) + and isinstance(test.left, ast.Name) + and test.left.id == "__name__" + ) + if is_entrypoint: + return + if isinstance(test, ast.Name) and self.constants.get(test.id) is False: + for stmt in node.orelse: + self.visit(stmt) + return + self.generic_visit(node) + + def visit_Call(self, node: ast.Call) -> None: + func = node.func + if isinstance(func, ast.Name) and func.id in self.exports: + self.calls[func.id] += 1 + self.builders |= func.id in {"BuildLine", "BuildSketch", "BuildPart"} + elif isinstance(func, ast.Attribute): + if isinstance(func.value, ast.Name) and func.value.id in self.aliases: + self.calls[func.attr] += 1 + self.builders |= func.attr in {"BuildLine", "BuildSketch", "BuildPart"} + else: + self.methods[func.attr] += 1 + self.generic_visit(node) + + def visit_BinOp(self, node: ast.BinOp) -> None: + self.operators[type(node.op).__name__] += 1 + self.generic_visit(node) + + +def inventory(manifest_path: Path) -> dict[str, Any]: + import build123d as bd + from build123d.build_common import BaseObjectMeta, Builder + from build123d.topology.shape_core import Shape + from build123d.topology.one_d import Mixin1D + from build123d.topology.two_d import Mixin2D + from build123d.topology.three_d import Mixin3D + + package_dir = Path(bd.__file__).parent + manifest = json.loads(manifest_path.read_text()) + top_level: list[dict[str, Any]] = [] + members: dict[str, dict[str, Any]] = {} + classes: dict[str, list[str]] = {} + extra_classes = [Shape, Mixin1D, Mixin2D, Mixin3D, Builder, BaseObjectMeta] + for name in bd.__all__: + obj = getattr(bd, name) + record = { + "name": name, + "kind": "class" if inspect.isclass(obj) else "function" if callable(obj) else "value", + "category": category(name, obj), + "module": getattr(obj, "__module__", type(obj).__module__), + "conversion_status": "unverified", + **source_info(obj, package_dir), + } + if inspect.isclass(obj) and issubclass(obj, Enum): + record["values"] = list(obj.__members__) + top_level.append(record) + if inspect.isclass(obj): + extra_classes.append(obj) + for cls in dict.fromkeys(extra_classes): + refs = [] + for name in sorted(dir(cls)): + if name.startswith("_") and name not in OPERATORS | {"__enter__", "__exit__", "__call__"}: + continue + owner = next((parent for parent in cls.__mro__ if name in vars(parent)), None) + if owner is None or not owner.__module__.startswith("build123d"): + continue + raw = vars(owner)[name] + value = raw.fget if isinstance(raw, property) else raw.__func__ if isinstance(raw, (staticmethod, classmethod)) else raw + if not callable(value) and not isinstance(raw, property): + continue + key = owner.__module__ + "." + owner.__name__ + "." + name + refs.append(key) + if key not in members: + members[key] = { + "name": name, + "owner": owner.__module__ + "." + owner.__name__, + "category": member_category(name, raw, owner), + "descriptor": "property" if isinstance(raw, property) else "classmethod" if isinstance(raw, classmethod) else "staticmethod" if isinstance(raw, staticmethod) else "method", + "conversion_status": "unverified", + **source_info(value, package_dir), + } + classes[cls.__module__ + "." + cls.__name__] = refs + models = [] + all_calls: Counter[str] = Counter() + all_methods: Counter[str] = Counter() + for item in manifest["examples"]: + model_path = manifest_path.parent / item["file"] + visitor = ModelVisitor(set(bd.__all__)) + visitor.visit(ast.parse(model_path.read_text())) + all_calls.update(visitor.calls) + all_methods.update(visitor.methods) + models.append({ + "id": item["id"], "name": item["name"], "file": item["file"], + "source_url": item["source_url"], + "builder_context_present": visitor.builders, + "top_level_call_sites": dict(visitor.calls.most_common()), + "method_call_sites": dict(visitor.methods.most_common()), + "operator_syntax_counts": dict(visitor.operators.most_common()), + }) + return { + "schema_version": 1, + "purpose": "Version-specific API inventory and static source corpus evidence; unverified is not implemented support.", + "build123d_version": bd.__version__, + "corpus_tag": manifest["tag"], + "corpus_commit": manifest["commit"], + "sources": DOCUMENTATION_SOURCES, + "scope": "203 package __all__ exports plus public build123d-declared members reachable through these classes, Shape, topology mixins and Builder; Python/OCP internals are excluded.", + "counts": { + "top_level_exports": len(top_level), "unique_public_member_declarations": len(members), + "class_interfaces": len(classes), "corpus_models": len(models), + "corpus_distinct_top_level_calls": len(all_calls), + "corpus_top_level_call_sites": sum(all_calls.values()), + "top_level_by_category": dict(Counter(item["category"] for item in top_level)), + "members_by_category": dict(Counter(item["category"] for item in members.values())), + }, + "top_level_api": top_level, + "members": members, + "class_members": classes, + "corpus": { + "counting_note": "AST call sites, not runtime execution counts. Constant-false GEN_DOCS branches and __main__ export blocks are omitted; loops/functions are counted syntactically. Operator counts include numeric arithmetic.", + "top_level_calls": dict(all_calls.most_common()), + "method_calls": dict(all_methods.most_common()), + "models": models, + }, + } + + +def validation_evidence(data: dict[str, Any], report_path: Path, traces_dir: Path | None) -> None: + """Link only verified samples, never promote an entire API parameter space.""" + report = json.loads(report_path.read_text()) + rows = {row["stem"]: row for row in report["rows"]} + accepted = {stem for stem, row in rows.items() if row.get("quality") == "accepted"} + usage: dict[str, set[str]] = {} + for model in data["corpus"]["models"]: + stem = Path(model["file"]).stem + for api in model["top_level_call_sites"]: + usage.setdefault(api, set()).add(stem) + observed_members: dict[str, set[str]] = {} + if traces_dir is not None: + for path in traces_dir.glob("*.trace.json"): + stem = path.name.removesuffix(".trace.json") + trace = json.loads(path.read_text()) + for step in trace.get("steps", []): + source = step.get("source") + if source and step.get("op") != "unsupported": + observed_members.setdefault(source, set()).add(stem) + source_report = {"path": str(report_path), + "sha256": hashlib.sha256(report_path.read_bytes()).hexdigest()} + for record in data["top_level_api"]: + exercised = usage.get(record["name"], set()) + verified = sorted(exercised & accepted) + if verified: + record["conversion_status"] = "verified_sampled_usage" + record["validation_evidence"] = { + "accepted_models": verified, + "rejected_or_unverified_models": sorted(exercised - accepted), + "scope": "Model-level evidence for the listed source calls only; other argument variants remain unverified.", + } + for record in data["members"].values(): + source = record["owner"].rsplit(".", 1)[-1] + "." + record["name"] + exercised = observed_members.get(source, set()) + verified = sorted(exercised & accepted) + if verified: + record["conversion_status"] = "verified_sampled_usage" + record["validation_evidence"] = {"accepted_models": verified, + "scope": "Captured member call in accepted models; other argument variants remain unverified."} + data["verification"] = {"source_report": source_report, + "accepted_models": sorted(accepted), + "rejected_or_unverified_models": sorted(set(rows) - accepted), + "scope": "Sample-level acceptance is not a claim of all-API or all-parameter coverage.", + "verified_top_level_entries": sum(r["conversion_status"] == "verified_sampled_usage" for r in data["top_level_api"]), + "verified_public_member_entries": sum(r["conversion_status"] == "verified_sampled_usage" for r in data["members"].values())} + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--manifest", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--validation-report", type=Path, help="Optional strict stage-3 report for sample evidence") + parser.add_argument("--traces-dir", type=Path, help="Trace source member names supporting the validation report") + args = parser.parse_args() + data = inventory(args.manifest.resolve()) + if args.validation_report is not None: + validation_evidence(data, args.validation_report, args.traces_dir) + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n") + print(json.dumps(data["counts"], indent=2, ensure_ascii=False)) + + +if __name__ == "__main__": + main() From f55c7fe0e0887db84d2ff838291e136d9ec93a68 Mon Sep 17 00:00:00 2001 From: NiJingzhe <1448976235@qq.com> Date: Fri, 9 Oct 2026 18:31:38 +0800 Subject: [PATCH 03/39] fix(inspect): make pymupdf an optional drawing extra MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pymupdf (AGPL-3.0 / commercial dual license) was on the eager package import path via inspect.drawing, so 'import simplecadapi' hard-failed without it — including inside the render worker subprocess. The drawing modules now bind a lazy proxy (real module under TYPE_CHECKING); the first attribute access performs the import and a missing pymupdf raises an ImportError naming the new 'drawing' extra. Core install drops pymupdf; the dev extra keeps it for the test suite. Verified: fresh venv without pymupdf and py-slvs passes import, build, STEP export, render, solver-backend resolution; full suite 1941 passed / 5 skipped; ty diagnostics on the drawing package unchanged vs dev. --- CHANGELOG.md | 11 +++++ pyproject.toml | 5 ++- src/simplecadapi/inspect/drawing/_pdf.py | 7 +++- src/simplecadapi/inspect/drawing/_pymupdf.py | 40 +++++++++++++++++++ .../inspect/drawing/_section_layout.py | 2 +- src/simplecadapi/inspect/drawing/geometry.py | 7 +++- src/simplecadapi/inspect/drawing/render.py | 7 +++- src/simplecadapi/inspect/drawing/section.py | 8 +++- src/simplecadapi/inspect/drawing/summary.py | 7 +++- src/simplecadapi/inspect/drawing/text.py | 7 +++- test/test_drawing_lazy_pymupdf.py | 34 ++++++++++++++++ uv.lock | 12 ++++-- 12 files changed, 129 insertions(+), 18 deletions(-) create mode 100644 src/simplecadapi/inspect/drawing/_pymupdf.py create mode 100644 test/test_drawing_lazy_pymupdf.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f59fd0a..0a1541ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to SimpleCADAPI are documented here. Per-version user-facing notes live in [`docs/updates/`](docs/updates/) (English and 中文). +## Unreleased + +### Changed + +- pymupdf is no longer a default-install dependency: it is optional under + the new `drawing` extra. Engineering-drawing inspection (vector-PDF + measuring, sectioning, rendering of DXF/PDF drawings) is the only family + that uses it; `import simplecadapi`, modeling, STEP export, and VTK + rendering all work without it. Drawing functions without pymupdf raise an + ImportError naming the extra: `pip install 'simplecadapi[drawing]'`. + ## 2.1.3 — 2026-09-18 The addon ecosystem leaves the beta line: one stable `sca` CLI, addon diff --git a/pyproject.toml b/pyproject.toml index 11420f9f..b71695be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,6 @@ dependencies = [ "py-slvs==1.0.6", "ocp-gordon>=0.2,<0.3", "ezdxf>=1.4.4", - "pymupdf>=1.28.2", "marimo>=0.25.0", "plotly>=7.1.0", ] @@ -45,6 +44,10 @@ dev = [ "mypy>=1.0", "black>=23.0", "isort>=5.0", + "pymupdf>=1.28.2", +] +drawing = [ + "pymupdf>=1.28.2", ] editor = [] inspect = [ diff --git a/src/simplecadapi/inspect/drawing/_pdf.py b/src/simplecadapi/inspect/drawing/_pdf.py index 64475116..254bc3a8 100644 --- a/src/simplecadapi/inspect/drawing/_pdf.py +++ b/src/simplecadapi/inspect/drawing/_pdf.py @@ -14,9 +14,12 @@ from __future__ import annotations from pathlib import Path -from typing import Sequence +from typing import TYPE_CHECKING, Sequence -import pymupdf +if TYPE_CHECKING: + import pymupdf +else: + from ._pymupdf import pymupdf _ITEM_KINDS = {"l": "line", "c": "bezier", "qu": "quad", "re": "rect"} diff --git a/src/simplecadapi/inspect/drawing/_pymupdf.py b/src/simplecadapi/inspect/drawing/_pymupdf.py new file mode 100644 index 00000000..f4a9d49d --- /dev/null +++ b/src/simplecadapi/inspect/drawing/_pymupdf.py @@ -0,0 +1,40 @@ +"""Lazy access to pymupdf for the drawing inspection namespace. + +pymupdf (AGPL-3.0 / Artifex commercial dual license) is an optional dependency +of the ``drawing`` extra. It is needed only by the engineering-drawing family, +never by modeling, export or rendering, so ``import simplecadapi`` must work +without it. Modules bind the proxy exported here under the name ``pymupdf`` +(real module under ``TYPE_CHECKING``); the first attribute access performs the +actual import, and a missing pymupdf surfaces as an ImportError naming the +extra to install. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + import pymupdf # noqa: F401 + +_MISSING_PYMUPDF_MESSAGE = ( + "simplecadapi.inspect.drawing requires the optional 'drawing' extra; " + "install it with: pip install 'simplecadapi[drawing]' (provides pymupdf)" +) + + +class _LazyPymupdf: + """Stand-in for the ``pymupdf`` module that imports it on first use.""" + + __slots__ = () + + def __getattr__(self, name: str) -> Any: + try: + import pymupdf + except ImportError as exc: + raise ImportError(_MISSING_PYMUPDF_MESSAGE) from exc + return getattr(pymupdf, name) + + +pymupdf = _LazyPymupdf() + +__all__ = ["pymupdf"] diff --git a/src/simplecadapi/inspect/drawing/_section_layout.py b/src/simplecadapi/inspect/drawing/_section_layout.py index f5c91710..2502e571 100644 --- a/src/simplecadapi/inspect/drawing/_section_layout.py +++ b/src/simplecadapi/inspect/drawing/_section_layout.py @@ -2,7 +2,7 @@ import math -import pymupdf +from ._pymupdf import pymupdf from ._provenance import digest COLOR = (0.0, 0.0, 0.75) diff --git a/src/simplecadapi/inspect/drawing/geometry.py b/src/simplecadapi/inspect/drawing/geometry.py index f47a43ee..d3909e61 100644 --- a/src/simplecadapi/inspect/drawing/geometry.py +++ b/src/simplecadapi/inspect/drawing/geometry.py @@ -5,9 +5,12 @@ import json from dataclasses import asdict, dataclass, field from pathlib import Path -from typing import Any, Sequence +from typing import TYPE_CHECKING, Any, Sequence -import pymupdf +if TYPE_CHECKING: + import pymupdf +else: + from ._pymupdf import pymupdf from ._pdf import color_to_hex, item_kind, open_page, parse_color, point_to_display from ._provenance import page_metadata diff --git a/src/simplecadapi/inspect/drawing/render.py b/src/simplecadapi/inspect/drawing/render.py index 44cabf95..a6ba1ff0 100644 --- a/src/simplecadapi/inspect/drawing/render.py +++ b/src/simplecadapi/inspect/drawing/render.py @@ -4,9 +4,12 @@ import json from pathlib import Path -from typing import Any, Mapping, Sequence +from typing import TYPE_CHECKING, Any, Mapping, Sequence -import pymupdf +if TYPE_CHECKING: + import pymupdf +else: + from ._pymupdf import pymupdf from ._pdf import open_page from ._provenance import page_metadata, pixel_transform diff --git a/src/simplecadapi/inspect/drawing/section.py b/src/simplecadapi/inspect/drawing/section.py index 06ef2ca2..6966e776 100644 --- a/src/simplecadapi/inspect/drawing/section.py +++ b/src/simplecadapi/inspect/drawing/section.py @@ -13,9 +13,13 @@ import math from dataclasses import asdict, dataclass, field from pathlib import Path -from typing import Any, Mapping, Sequence +from typing import TYPE_CHECKING, Any, Mapping, Sequence + +if TYPE_CHECKING: + import pymupdf +else: + from ._pymupdf import pymupdf -import pymupdf import numpy as np from ._provenance import digest, model_metadata, pixel_transform, file_hash diff --git a/src/simplecadapi/inspect/drawing/summary.py b/src/simplecadapi/inspect/drawing/summary.py index 49fda483..5feb1f69 100644 --- a/src/simplecadapi/inspect/drawing/summary.py +++ b/src/simplecadapi/inspect/drawing/summary.py @@ -5,9 +5,12 @@ import json from dataclasses import asdict, dataclass from pathlib import Path -from typing import Any +from typing import TYPE_CHECKING, Any -import pymupdf +if TYPE_CHECKING: + import pymupdf +else: + from ._pymupdf import pymupdf from ._pdf import color_to_hex, item_kind diff --git a/src/simplecadapi/inspect/drawing/text.py b/src/simplecadapi/inspect/drawing/text.py index 773febcc..6fed8dcf 100644 --- a/src/simplecadapi/inspect/drawing/text.py +++ b/src/simplecadapi/inspect/drawing/text.py @@ -5,9 +5,12 @@ import json from dataclasses import asdict, dataclass, field from pathlib import Path -from typing import Any +from typing import TYPE_CHECKING, Any -import pymupdf +if TYPE_CHECKING: + import pymupdf +else: + from ._pymupdf import pymupdf from ._pdf import box_to_display, open_page from ._provenance import page_metadata diff --git a/test/test_drawing_lazy_pymupdf.py b/test/test_drawing_lazy_pymupdf.py new file mode 100644 index 00000000..fd3866b7 --- /dev/null +++ b/test/test_drawing_lazy_pymupdf.py @@ -0,0 +1,34 @@ +"""pymupdf stays off the package import path; drawing functions name the extra.""" + +import builtins +import subprocess +import sys + +import pytest + +from simplecadapi.inspect.drawing._pymupdf import _LazyPymupdf + + +def test_package_import_does_not_pull_pymupdf() -> None: + code = ( + "import sys, simplecadapi; " + "assert 'pymupdf' not in sys.modules, 'pymupdf imported eagerly'" + ) + subprocess.run([sys.executable, "-c", code], check=True) + + +def test_missing_pymupdf_names_the_drawing_extra(monkeypatch: pytest.MonkeyPatch) -> None: + real_import = builtins.__import__ + + def poisoned(name, *args, **kwargs): + if name == "pymupdf": + raise ImportError(f"No module named '{name}'") + return real_import(name, *args, **kwargs) + + monkeypatch.setattr(builtins, "__import__", poisoned) + with pytest.raises(ImportError, match=r"simplecadapi\[drawing\]"): + _LazyPymupdf().Rect + + +def test_present_pymupdf_passes_through() -> None: + assert callable(_LazyPymupdf().open) diff --git a/uv.lock b/uv.lock index 233b89f8..f5a9faa8 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 5 requires-python = ">=3.10, <3.14" resolution-markers = [ "python_full_version >= '3.12'", @@ -3239,7 +3239,6 @@ dependencies = [ { name = "ocp-gordon" }, { name = "plotly" }, { name = "py-slvs" }, - { name = "pymupdf" }, { name = "rfc8785" }, { name = "rich" }, { name = "tomli", marker = "python_full_version < '3.11'" }, @@ -3251,9 +3250,13 @@ dev = [ { name = "black" }, { name = "isort" }, { name = "mypy" }, + { name = "pymupdf" }, { name = "pytest" }, { name = "pytest-cov" }, ] +drawing = [ + { name = "pymupdf" }, +] fem = [ { name = "ccx2paraview", extra = ["vtk"] }, { name = "gmsh" }, @@ -3299,7 +3302,8 @@ requires-dist = [ { name = "ocp-gordon", specifier = ">=0.2,<0.3" }, { name = "plotly", specifier = ">=7.1.0" }, { name = "py-slvs", specifier = "==1.0.6" }, - { name = "pymupdf", specifier = ">=1.28.2" }, + { name = "pymupdf", marker = "extra == 'dev'", specifier = ">=1.28.2" }, + { name = "pymupdf", marker = "extra == 'drawing'", specifier = ">=1.28.2" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0" }, { name = "rfc8785", specifier = ">=0.1.4,<0.2.0" }, @@ -3307,7 +3311,7 @@ requires-dist = [ { name = "tomli", marker = "python_full_version < '3.11'", specifier = ">=2.0,<3" }, { name = "typing-extensions", specifier = ">=4.12,<5" }, ] -provides-extras = ["dev", "editor", "inspect", "whucad", "gmsh", "fem"] +provides-extras = ["dev", "drawing", "editor", "inspect", "whucad", "gmsh", "fem"] [package.metadata.requires-dev] dev = [ From 6bb9421870ca48e8fbab188e2fb5533d4ba8cc5d Mon Sep 17 00:00:00 2001 From: NiJingzhe <1448976235@qq.com> Date: Fri, 9 Oct 2026 21:40:14 +0800 Subject: [PATCH 04/39] feat(examples): add pcg_facade_tower PCG unitized-curtain-wall tower: one parametric code base, any plan (rect/chamfer/l_shape), floor count and setback policy, generating a manufacturable facade - 3,697 instances resolved onto 22-43 typed parts with a hard quantization-error bound. Pure-data layout engine (plan -> setback tiers -> per-edge subdivision -> panel schedule with K-quantized fin wave and ordered-dithered WWR), type part factories, band subassemblies, tower assembly, export (scadpkg + AP242 STEP + panel-schedule CSV) and eight verify gates with known-bad proofs. Imported as archived from the author's working stash; ported to the current SDK in the following commit. Co-Authored-By: Claude Sonnet 5.5 --- examples/pcg_facade_tower/BUILD_PLAN.md | 132 ++++ examples/pcg_facade_tower/REQUIREMENTS.md | 94 +++ examples/pcg_facade_tower/SDK_DEFECTS.md | 156 ++++ examples/pcg_facade_tower/corners.py | 39 + examples/pcg_facade_tower/export.py | 80 ++ examples/pcg_facade_tower/floor.py | 67 ++ examples/pcg_facade_tower/layout.py | 719 ++++++++++++++++++ examples/pcg_facade_tower/panels.py | 209 +++++ examples/pcg_facade_tower/slabs.py | 54 ++ examples/pcg_facade_tower/tower.py | 76 ++ examples/pcg_facade_tower/verify/_common.py | 55 ++ .../pcg_facade_tower/verify/render_stage.py | 394 ++++++++++ .../verify/renders/s1_elevation_chamfer.png | Bin 0 -> 87149 bytes .../verify/renders/s1_elevation_l_shape.png | Bin 0 -> 88080 bytes .../verify/renders/s1_elevation_rect.png | Bin 0 -> 88344 bytes .../verify/renders/s1_massing_chamfer.png | Bin 0 -> 53889 bytes .../verify/renders/s1_massing_l_shape.png | Bin 0 -> 56815 bytes .../verify/renders/s1_massing_rect.png | Bin 0 -> 52243 bytes .../verify/renders/s1_plan_chamfer.png | Bin 0 -> 83490 bytes .../verify/renders/s1_plan_l_shape.png | Bin 0 -> 80766 bytes .../verify/renders/s1_plan_rect.png | Bin 0 -> 79364 bytes .../verify/renders/s2_fin_bins.png | Bin 0 -> 65612 bytes .../verify/renders/s2_fin_sections.png | Bin 0 -> 137089 bytes .../verify/renders/s2_solid_types.png | Bin 0 -> 54033 bytes .../renders/s2_vision-w1500-h2700-s0.png | Bin 0 -> 56627 bytes .../renders/s2_vision-w1500-h3600-s1100.png | Bin 0 -> 57578 bytes .../verify/renders/s3_canopy.png | Bin 0 -> 85804 bytes .../verify/renders/s3_corner_m90.png | Bin 0 -> 89874 bytes .../verify/renders/s3_corner_m90_plan.png | Bin 0 -> 33899 bytes .../verify/renders/s3_corner_p45.png | Bin 0 -> 70644 bytes .../verify/renders/s3_corner_p45_plan.png | Bin 0 -> 37296 bytes .../verify/renders/s3_corner_p90.png | Bin 0 -> 90397 bytes .../verify/renders/s3_corner_p90_plan.png | Bin 0 -> 34641 bytes .../verify/renders/s3_skeleton_chamfer.png | Bin 0 -> 141788 bytes .../verify/renders/s3_skeleton_l_shape.png | Bin 0 -> 160758 bytes .../verify/renders/s3_skeleton_rect.png | Bin 0 -> 120236 bytes .../verify/renders/s4_band_lobby.png | Bin 0 -> 83122 bytes .../verify/renders/s4_band_tier0-phase0.png | Bin 0 -> 99879 bytes .../verify/renders/s4_corner_sw.png | Bin 0 -> 75052 bytes .../verify/renders/s4_plan_chamfer.png | Bin 0 -> 36300 bytes .../verify/renders/s5_setback.png | Bin 0 -> 123317 bytes .../verify/renders/s5_south.png | Bin 0 -> 78684 bytes .../verify/renders/s5_tower.png | Bin 0 -> 195142 bytes .../pcg_facade_tower/verify/s1_known_bad.py | 118 +++ examples/pcg_facade_tower/verify/s1_verify.py | 227 ++++++ .../pcg_facade_tower/verify/s2_known_bad.py | 81 ++ examples/pcg_facade_tower/verify/s2_verify.py | 186 +++++ .../pcg_facade_tower/verify/s3_known_bad.py | 105 +++ examples/pcg_facade_tower/verify/s3_verify.py | 317 ++++++++ .../pcg_facade_tower/verify/s4_known_bad.py | 132 ++++ examples/pcg_facade_tower/verify/s4_verify.py | 288 +++++++ .../pcg_facade_tower/verify/s5_known_bad.py | 120 +++ examples/pcg_facade_tower/verify/s5_verify.py | 359 +++++++++ examples/pcg_facade_tower/verify/s6_verify.py | 157 ++++ examples/pcg_facade_tower/verify/s7_verify.py | 203 +++++ examples/pcg_facade_tower/verify/s8_verify.py | 238 ++++++ 56 files changed, 4606 insertions(+) create mode 100644 examples/pcg_facade_tower/BUILD_PLAN.md create mode 100644 examples/pcg_facade_tower/REQUIREMENTS.md create mode 100644 examples/pcg_facade_tower/SDK_DEFECTS.md create mode 100644 examples/pcg_facade_tower/corners.py create mode 100644 examples/pcg_facade_tower/export.py create mode 100644 examples/pcg_facade_tower/floor.py create mode 100644 examples/pcg_facade_tower/layout.py create mode 100644 examples/pcg_facade_tower/panels.py create mode 100644 examples/pcg_facade_tower/slabs.py create mode 100644 examples/pcg_facade_tower/tower.py create mode 100644 examples/pcg_facade_tower/verify/_common.py create mode 100644 examples/pcg_facade_tower/verify/render_stage.py create mode 100644 examples/pcg_facade_tower/verify/renders/s1_elevation_chamfer.png create mode 100644 examples/pcg_facade_tower/verify/renders/s1_elevation_l_shape.png create mode 100644 examples/pcg_facade_tower/verify/renders/s1_elevation_rect.png create mode 100644 examples/pcg_facade_tower/verify/renders/s1_massing_chamfer.png create mode 100644 examples/pcg_facade_tower/verify/renders/s1_massing_l_shape.png create mode 100644 examples/pcg_facade_tower/verify/renders/s1_massing_rect.png create mode 100644 examples/pcg_facade_tower/verify/renders/s1_plan_chamfer.png create mode 100644 examples/pcg_facade_tower/verify/renders/s1_plan_l_shape.png create mode 100644 examples/pcg_facade_tower/verify/renders/s1_plan_rect.png create mode 100644 examples/pcg_facade_tower/verify/renders/s2_fin_bins.png create mode 100644 examples/pcg_facade_tower/verify/renders/s2_fin_sections.png create mode 100644 examples/pcg_facade_tower/verify/renders/s2_solid_types.png create mode 100644 examples/pcg_facade_tower/verify/renders/s2_vision-w1500-h2700-s0.png create mode 100644 examples/pcg_facade_tower/verify/renders/s2_vision-w1500-h3600-s1100.png create mode 100644 examples/pcg_facade_tower/verify/renders/s3_canopy.png create mode 100644 examples/pcg_facade_tower/verify/renders/s3_corner_m90.png create mode 100644 examples/pcg_facade_tower/verify/renders/s3_corner_m90_plan.png create mode 100644 examples/pcg_facade_tower/verify/renders/s3_corner_p45.png create mode 100644 examples/pcg_facade_tower/verify/renders/s3_corner_p45_plan.png create mode 100644 examples/pcg_facade_tower/verify/renders/s3_corner_p90.png create mode 100644 examples/pcg_facade_tower/verify/renders/s3_corner_p90_plan.png create mode 100644 examples/pcg_facade_tower/verify/renders/s3_skeleton_chamfer.png create mode 100644 examples/pcg_facade_tower/verify/renders/s3_skeleton_l_shape.png create mode 100644 examples/pcg_facade_tower/verify/renders/s3_skeleton_rect.png create mode 100644 examples/pcg_facade_tower/verify/renders/s4_band_lobby.png create mode 100644 examples/pcg_facade_tower/verify/renders/s4_band_tier0-phase0.png create mode 100644 examples/pcg_facade_tower/verify/renders/s4_corner_sw.png create mode 100644 examples/pcg_facade_tower/verify/renders/s4_plan_chamfer.png create mode 100644 examples/pcg_facade_tower/verify/renders/s5_setback.png create mode 100644 examples/pcg_facade_tower/verify/renders/s5_south.png create mode 100644 examples/pcg_facade_tower/verify/renders/s5_tower.png create mode 100644 examples/pcg_facade_tower/verify/s1_known_bad.py create mode 100644 examples/pcg_facade_tower/verify/s1_verify.py create mode 100644 examples/pcg_facade_tower/verify/s2_known_bad.py create mode 100644 examples/pcg_facade_tower/verify/s2_verify.py create mode 100644 examples/pcg_facade_tower/verify/s3_known_bad.py create mode 100644 examples/pcg_facade_tower/verify/s3_verify.py create mode 100644 examples/pcg_facade_tower/verify/s4_known_bad.py create mode 100644 examples/pcg_facade_tower/verify/s4_verify.py create mode 100644 examples/pcg_facade_tower/verify/s5_known_bad.py create mode 100644 examples/pcg_facade_tower/verify/s5_verify.py create mode 100644 examples/pcg_facade_tower/verify/s6_verify.py create mode 100644 examples/pcg_facade_tower/verify/s7_verify.py create mode 100644 examples/pcg_facade_tower/verify/s8_verify.py diff --git a/examples/pcg_facade_tower/BUILD_PLAN.md b/examples/pcg_facade_tower/BUILD_PLAN.md new file mode 100644 index 00000000..6fb6569d --- /dev/null +++ b/examples/pcg_facade_tower/BUILD_PLAN.md @@ -0,0 +1,132 @@ +# BUILD_PLAN: pcg_facade_tower + +Datum: 原点 = 地坪 ∩ 平面参考点(RECT/CHAMFER/L_SHAPE 的 SW 角),Z up,+X 东 +Y 北;平面多边形 CCW, +边 i 自顶点 i → i+1,切向 t_i,外法向 n_i = (t_y, −t_x)。building line = tier 多边形。 +板件局部系:x 沿边(0 = 板左端缝中线),y 向上(0 = 楼层标高),z 外法向(0 = building line)。 +placement:origin = V_i + s0·t_i + z_floor·ẑ,x_axis = t_i,y_axis = ẑ(右手:z_axis = t_i × ẑ = n_i)。 +角件局部系:origin = building line 顶点,x = 入边切向,y 向上,z = 入边外法向;平面轮廓在局部 (x, z) 内。 +竖挺局部系:轴同板件;origin = 板局部 (w − joint/2 − frame_sight/2, 0, frame_d)(右竖框中线 × 框外面)。 + +构造策略:**布局引擎 (layout.py) 是唯一的 PCG 源**,只产数据(FacadeSchedule:tier 多边形、每层每边的板序列、 +板型表、floor 类型表);几何文件只消费板型参数。板型 = `scad.part(id=)` 工厂,参数全部经 builder +实参进入 build_key → 同参数同 id 命中缓存;floor 类型 = `scad.assemble` 子装配,塔楼只放 floor 实例。 + +## 文件 + +| 文件 | 内容 | +| --- | --- | +| `layout.py` | FacadeParams、平面/退台、分格、收口、角部、波场 + 量化、抖动 WWR、板型/floor 类型去重 | +| `panels.py` | 板件族 builder(vision / solid / fin)+ Part 工厂 `make_panel_part(type_id, spec, params)` | +| `corners.py` | 凸角 / 凹角收口件(草图多边形拉伸) | +| `slabs.py` | 楼板 / 屋面退台板 / 雨棚 | +| `floor.py` | 带子装配(floor 类型 / lobby / 女儿墙;板 + 竖挺 + 角件,全 ground) | +| `tower.py` | 塔楼装配 | +| `export.py` | scadpkg / STEP / CSV / 渲染 | +| `verify/` | `sN_verify.py`、`render_stage.py`、`_common.py` | + +## 阶段 + +- **S1 布局引擎**(无几何) + - 输出边界: `build_schedule(params) -> FacadeSchedule`(JSON 可序列化)。 + - 验证: 每边 Σ宽 = 边长(1e-9);收口宽 ∈ [closer_min, closer_min + w_std/2);守卫矩阵(边过短 / 收口越界 / K<2 / 退台过深) + 恰等即拒;设计 WWR 与目标差 ≤ 0.03;板型数 / floor 类型数;三种平面都能出表。 + - 渲染: massing(tier 多边形拉伸 + lobby)四视图 + matplotlib 平面分格图(每 tier 的板/收口/角件着墨)。 +- **S2 板件族** + - 输出边界: 每 kind 至少一个板型单实体;玻璃面 tag。 + - 验证: V3 尺寸;框外面在 z=frame_d、building line 侧 z=0;缝 joint/2;玻璃 tag 面积 = 设计开口; + V5 竖挺角(各 bin);单实体 + brep valid。 + - 渲染: 每板型一张四视图(含一张 K 档竖挺并排)。 +- **S3 角件 + 楼板 + 雨棚** + - 验证: V7;角件多边形与相邻板端(布局值)缝 = joint;楼板内缩 slab_gap;雨棚在南边入口居中。 + - 渲染: 凸 90 / 凸 135 / 凹 270 角件各一 + 与两侧各一块板的局部拼装。 +- **S4 楼层子装配**(先 tier0 第 1 层) + - 验证: V1、V2(全层)、V4(本层)、ground 全部、solve 报告。 + - 渲染: 单层 iso + 顶视(缝可见)+ 角部特写。 +- **S5 塔楼装配** + - 验证: V1/V2 抽样(每 floor 类型一层 + 退台上下层)、V4 全楼、V5 包络、V6、V8、实例数 / 定义数。 + - 渲染: 四视图 + 南立面 + 退台特写。 +- **S6 合理化 / 尺度 / 平面扫描** + - 验证: K ∈ {2,3,4,6,8,12,24}:板型数单调、最大量化角误差 = 90/(2(K−1));层数 ∈ {8,20,36,48}(setback_every = ceil(n/3),保持 3 tier):标准板型集合不变; + RECT/CHAMFER/L_SHAPE 全过 V1/V4。 + - 产物: `out/rationalization.png`(板型数 vs 角误差)、`out/scale_sweep.json`。 +- **S7 增量重建** + - 验证: V9(cold → warm 全 hit;fin_depth 改 → miss = 竖挺件;n_floors 改 → 板型 hit);耗时表。 +- **S8 导出** + - 验证: V10;CSV 板块清单(type_id, kind, w, h, count)。 + +## Stage checklist + +```text +[x] Requirements +[x] Plan +[x] S1 layout [x] S1 verify [x] S1 render +[x] S2 panels [x] S2 verify [x] S2 render +[x] S3 corners [x] S3 verify [x] S3 render +[x] S4 floor [x] S4 verify [x] S4 render +[x] S5 tower [x] S5 verify [ ] S5 render +[ ] S6 sweeps [ ] S6 verify +[ ] S7 incremental [ ] S7 verify +[ ] S8 export [ ] S8 verify +``` + +## Feasibility probe(开工前,/tmp/pcg_probe) + +- 12 板型 × 3000 实例平铺单层装配:SDK 原 `OperationGraph.is_dag` 递归 DFS 在 ~1000 个 add_component 时 + RecursionError;`Assembly.__post_init__` 的 `ids.count` 去重使每次 add 为 O(N²)(3000 实例 69 s)。 + 已修(Kahn 迭代 + Counter)→ 3000 实例装配 12.6 s、capture 5.8 s、STEP 5.8 s(3000 occurrence,3.4 MB)。 +- 渲染 3000 个 Located 共享 TShape 的复合体 ~10 s。 +- `@scad.part` 的 part_id 必须等于装饰器 id → 每板型用 `scad.part(id=type_id)(builder)` 工厂。 +- 仍用楼层子装配分层:塔楼只放 ~40 个 floor 实例,floor 类型复用(tier × 相位)。 + +## Stage log + +- **S1**(`s1_verify.py` PASS,`s1_known_bad.py` 9/9 as designed) + - WWR 目标下调为 N 0.50 / E,W 0.40 / S 0.35:原 N 0.55 超出物理上限(框 + 层间 + 实体收口 → 全 vision 约 0.54), + 引擎现在对不可达目标直接报错。 + - WWR 分配改为**全楼按朝向合池** + **Bayer 秩选择**(按 4×4 阈值排序取前 round(f·N) 格):逐边 / 逐 tier 合池在 + 切角、缺口、顶 tier 短边上不可达;纯阈值法把比例量化到 1/16(误差到 0.024)。现三种平面 × 8/20/36 层误差 ≤ 0.005。 + - 默认 36 层 CHAMFER:26 板型(solid 12 / vision 8 / corner 6),标准 vision 7 = K+1,12 floor 类型,2735 实例。 + - 48 层 + 每 12 层退 3000 → 4 个 tier,CHAMFER 顶 tier 切角边 1029 < 2c+2·closer_min、L_SHAPE 缺口边反向 — + 守卫正确拒绝;S6 层数扫描改为 setback_every = ceil(n_floors/3)。 + - 观察(留到调参):W/E 立面 θ_sun = ±30 叠加幅值 30 → 大量饱和在 ±45 档。 +- **S2**(`s2_verify.py` PASS 20 型:solid 12 / vision 2 / fin 6;`s2_known_bad.py` 12/12 as designed) + - V3 逼出两处设计修改(回写 S1,S1 gate 加 C10 + 竖挺记录一致性检查,KB9/KB10): + 竖挺改为独立 Part(45° 挺装在板上 bbox ≈ 1676 > 1600)→ vision 板型不再乘 K,标准板型 = 2 + K 个竖挺件; + lobby 5400 > 4200 → 两排 2700。默认 CHAMFER 现 26 型(solid 12 / vision 2 / corner 6 / fin 6),3697 实例。 + - 框环 = 一张草图外环 + 1–2 个内环(全约束),玻璃 / 层间板为凹进板,向框内各伸 frame_sight/2 以融合成单实体。 + - SDK 行为:变换(translate/rotate)或后续布尔后,面 tag 只留在 lineage 作用域,`ql.tag(...)` 默认 effective 查不到; + 因此玻璃 tag 放在最后一步,渲染高亮用板局部坐标(不变换)。S4/S5 的 V4 用定义体上的 tag 面积 × 实例数。 +- **S3**(`s3_verify.py` PASS;`s3_known_bad.py` 14/14 as designed) + - 角件 9 型(turn −90 / +45 / +90 × h 2700 / 3600 / 1200);三种平面 × 每 (tier, 带类) 一带共 105 处角部在世界坐标实测: + 外面与两侧板带外面共面、building line 面、端面在 corner_c − joint/2,与两侧板最小距离 = joint。 + - K6 实测到 A7 的舍入:收口板按 0.001 mm 取整建型、按精确起点放置,其后的缝偏差 ≤ 3.1e-4 mm; + 缝容差取 A7 声明的 5e-4(不是放宽几何,是把 A7 写进 gate)。 + - 楼板:每 tier 一型,38 个实例(地坪 + 各层 + 各 tier 屋面;上 tier 首层立在下 tier 屋面上,不另设板); + 楼板与同层板件 / 角件最小距离 = slab_gap。雨棚 6 模数,两端落在 lobby 板缝上、居中、外挑起点距板外面 = joint, + 底面在 lobby 两排的横缝上。 + - SDK 修复(建筑尺度首次触发,均带回归测试 `test_building_scale_part_hashes_and_round_trips_its_state`): + ① 几何指纹按 1e-7 量化,36 m 楼板体积 / 1e-7 超出 2^53 → 哈希被 JSON 安全整数检查拒绝; + ② RFC 8785 把 < 1e21 的整值 double(楼板惯量 ≈ 1.2e19)写成无指数整数,读回 latest-parts 状态时被当作越界整数拒绝。 + - (S5 规划时回改)屋面板原按楼板惯例占 [roof, roof + slab_t],会切进上 tier 首层(其板件从 roof + j/2 起、位于上 tier + building line 上,而屋面板平面是下 tier 的)→ 屋面板改占 [roof − slab_t, roof](顶面 = 屋面 / 退台面,藏在顶层板带头部后)。 + K3 改写:屋面板顶 = 女儿墙标高、与顶层板件距离 = slab_gap、与上 tier 首层板件 / 角件 / 竖挺距离 = joint/2; + `s3_known_bad` 加 KB10(楼板式屋面板)→ 15/15。SDK 缺陷统一记在 `SDK_DEFECTS.md`。 +- **S4**(`s4_verify.py` PASS 全部 16 带;`s4_known_bad.py` 13/13 as designed,每例须触发列出的 gate) + - 带子装配 = `scad.assemble(id="band-")`,定义 = 本带用到的板型 Part(floor 带 11–12 个、lobby / 女儿墙 5 个); + 构件 id `r{row}-e{edge}-s{slot}` / `…-fin` / `r{row}-v{vertex}`,全部 ground。楼板、雨棚留给塔楼放置(REQUIREMENTS 6 已改)。 + - 验证在**求解后的 Placement** 上独立重建 gp_Trsf(不走布局帧),并与 SDK `make_compound_from_assembly` 的体积 / bbox 对账; + V1 每排每边「角件 | 板按 slot | 角件」沿 t 顺序 + 缝 = joint(A7 容差)+ z 跨度;V2 对 bbox 相交的全部构件对做 Common + (floor 带 22–70 对,含竖挺与所在板、lobby 上下排);V4 定义体 tag 玻璃面积 = 布局设计值。 + - 本带 WWR(仅报告,目标按全楼朝向合池,S5 检):tier0-phase0 E .530 / N .544 / S .439 / W .549,phase1/3 低至 .21–.35。 + - 重建全 warm(无 dirty instance,定义 hash 不变);16 带 cold + warm + 全部检查 88 s。 +- **S5**(`s5_verify.py` PASS;`s5_known_bad.py` 11/11 as designed) + - 塔楼 = `scad.assemble(id="facade-tower")`,79 构件(lobby + 36 floor + 3 女儿墙 + 38 楼板 / 屋面板 + 雨棚), + 20 定义(16 带 + 3 tier 楼板 + 雨棚),展开 3697 件 / 26 型;SDK 展平复合体 3736 实体(+ 板 / 雨棚),高 136.2 m。 + - 验证在「塔楼 placement × 带 placement」合成的 gp_Trsf 上重建世界几何:T0 构件 / 定义 / 叶子型集 / 件数; + T1 全部 placement 为纯 z 平移 + SDK 投影对账;V8 楼层 / 女儿墙 / 屋面板标高与 tier,建筑线内缩 = k·setback_depth; + V1 / V5 / V2 抽样 19 个实现(lobby、首末层、每 floor 类型首层、每次退台上下层、全部女儿墙),18 个接缝窗口 1845 对 Common。 + - V4 全楼(定义体 tag 玻璃面积 × 实例数):E .400 / N .499 / S .351 / W .398,与 `design_wwr` 一致、距目标 ≤ 0.001。 + - V6:标准板型 `solid-w1500-h3600` + `vision-w1500-h3600-s1100`,竖挺 6 型 = K。 + - known-bad 逼出的两处 gate 修正:KB2(缺一层)T1 是 SDK-对-我们的一致性检查,自洽时不该响 → 期望改 T0 + V4; + KB4(女儿墙放错 roof)按 schedule id 选接缝窗口会漏掉被放错的构件 → 窗口改为「实测 z 区间与窗口相交的全部构件」。 + - 耗时:塔楼 build 47.2 s,零改动 rebuild 45.8 s(warm 不比 cold 快,见 SDK_DEFECTS D7),全部检查 169 s。 diff --git a/examples/pcg_facade_tower/REQUIREMENTS.md b/examples/pcg_facade_tower/REQUIREMENTS.md new file mode 100644 index 00000000..fd9ce72f --- /dev/null +++ b/examples/pcg_facade_tower/REQUIREMENTS.md @@ -0,0 +1,94 @@ +# REQUIREMENTS: pcg_facade_tower + +PCG 单元式幕墙塔楼:同一份代码,任意平面轮廓 / 层数 / 退台,自动生成**可加工**的外立面。 +论点:参数化的是**实例化**(少量板型 Part × 大量 placement),不是几何堆砌;GN 网格没有"板型"。 + +## CAD brief + +```text +- Model: pcg-facade-tower, assembly (panel/corner/slab Parts → floor subassemblies → tower) +- Inputs: prose (本会话讨论);inspiration, not reproduction +- Units: mm, degrees +- Coordinate convention: Z up;原点 = 地坪 z=0 ∩ 平面参考点;+X 东、+Y 北;平面多边形 CCW +- Overall dimensions (default CHAMFER plan): 36000 x 24000 底平面,NE 角 45° 切角 6000; + lobby 5400 + 36 层 x 3600 → 屋面 135000;每 12 层四边内退 3000(3 个 tier) +- Functional features: 标准板(vision + 遮阳竖挺 / vision 无挺 / solid 实体板)、收口板 closer、 + lobby 通高玻璃板、女儿墙板、角部收口件(凸角 90°/135°、凹角 270°)、楼板/屋面/退台板、主入口雨棚 +- Positioning/mating: 板件落在 building line(楼板外沿参考线)外侧 y∈[0, frame_d]; + placement 由布局引擎自具名基准(building line 顶点、楼层标高)计算;幕墙固定于结构 → 全部 ground +- Parameters: 见 layout.py FacadeParams(全部具名;板件尺寸经 builder 参数传入以进入 build_key) +- Paths: examples/pcg_facade_tower/{layout,panels,corners,slabs,floor,tower,export}.py;out/*.scadpkg|step|csv|png +- Validation targets: 见下文 V1–V10 +- Assumptions: 见下文 A1–A8 +``` + +## 设计参数(默认值) + +| 组 | 参数 | 默认 | 说明 | +| --- | --- | --- | --- | +| 平面 | `plan_kind` | CHAMFER | RECT / CHAMFER / L_SHAPE | +| | `plan_w`, `plan_d` | 36000, 24000 | X / Y 外包 | +| | `chamfer` | 6000 | CHAMFER:NE 角沿两边各切 6000(45° 边) | +| | `notch_w`, `notch_d` | 12000, 9000 | L_SHAPE:NE 角缺口 → 1 个 270° 凹角 | +| 竖向 | `n_floors` | 36 | lobby 之上的标准层数 | +| | `floor_h`, `lobby_h` | 3600, 5400 | | +| | `setback_every`, `setback_depth` | 12, 3000 | 每 tier 12 层,四边同时内退 | +| 模数 | `w_std` | 1500 | 标准板宽(含缝) | +| | `closer_min` | 450 | 收口板最小宽(含缝);两端对称 → 上限 closer_min + w_std/2(不含) | +| | `joint` | 20 | 板间缝(四周各 joint/2) | +| | `corner_c` | 450 | 角部收口件沿各边占宽(自 building line 顶点) | +| 板件 | `frame_d`, `frame_sight` | 150, 60 | 框深 / 框面宽 | +| | `spandrel_h` | 1100 | 层间实体区高(盖住楼板边) | +| | `glass_t`, `glass_recess` | 24, 40 | 玻璃厚 / 距框外面凹进 | +| 遮阳 | `fin_t`, `fin_depth` | 40, 300 | 竖挺厚 / 伸出深度(自框外面) | +| | `fin_amp`, `fin_wavelength`, `fin_period_floors` | 30°, 18000, 4 | 波场:θ = θ_sun(边) + A·sin(2π(u/λ + f/P)) | +| | `fin_bins` K | 6 | θ 量化到 [-45°, 45°] 的 K 档(合理化旋钮) | +| 窗墙比 | `wwr_target` | S 0.35 / E,W 0.40 / N 0.50 | 按边外法向归到 4 个朝向;全楼按朝向合池,上限约 0.54(不可达即报错) | +| 太阳 | `sun_azimuth` | 180° | 自北顺时针;朝北边(n·sun ≤ 0)无竖挺 | +| 板型 | `type_round_mm` | 1e-3 | 板型身份 = 参数四舍五入到 0.001 mm(闭合用精确值,误差 ≤ 5e-4 由缝吸收) | + +## 需求区 + +1. **布局引擎**(纯 Python,无几何):平面 → tier 退台多边形 → 每边:角部占宽 → 标准板数 n + 两端对称收口板 → + 每块板的 (floor, edge, s0, s1, kind, fin_bin) → 板型去重 → floor 类型去重(tier × 相位 f mod P)。 +2. **窗墙比分配**:每边 vision/solid 由有序抖动(4×4 Bayer,按 bay × floor)分配,使该朝向实测 WWR 贴近目标。 +3. **板件族**:vision(标准层带层间区 / lobby 无层间区)、solid(实体标准板、收口板、lobby 收口、女儿墙)、 + fin(K 档竖挺,独立 Part,现场挂在板右竖框上);板件单实体,玻璃面打 tag `facade.vision_glass`。 + lobby 5400 超运输高度 → 上下两排 2700 板(排数 = ceil(lobby_h / 4200))。 +4. **角部收口件**:由相邻两边方向 + frame_d + corner_c 计算的平面多边形 → 草图拉伸;凸角与凹角两族。 +5. **楼板 / 屋面 / 退台 / 雨棚**:tier 多边形内缩 slab_gap 拉伸;退台 = 下 tier 屋面;南向主入口雨棚。 +6. **楼层子装配**(带子装配):每个 floor 类型 / lobby / 各 tier 女儿墙一个 `scad.assemble` 定义,内含该带所有板、竖挺与角件(ground,placement 来自布局帧,带局部 z = 0 为本带标高;lobby 含上下两排);相同 floor 类型只建一次。楼板与雨棚由塔楼装配直接放置(上 tier 首层立在下 tier 屋面上,楼板不是 floor 类型的属性)。 +7. **塔楼装配**:lobby 层 + 36 标准层(floor 类型实例)+ 各 tier 屋面/女儿墙 + 雨棚。 +8. **合理化与尺度**:K 扫描(板型数 vs 最大角度偏差);层数扫描(8/20/36/48 层:标准板型数不增长);三种平面。 +9. **增量重建**:改 `fin_depth` → 只有竖挺件 miss,其余命中;改 `n_floors` → 板型全部命中。 +10. **导出**:scadpkg + AP242 STEP(共享定义)+ 板块清单 CSV + 渲染。 + +## 验证目标 + +| # | 检查 | 方法(几何实测,不信设计值) | +| --- | --- | --- | +| V1 | 立面闭合 | 每层每边:世界坐标下板/角件沿边区间(bbox 投影)首尾相接,缝 = joint ± 1e-3,无重叠;角件与两侧板缝 = joint | +| V2 | 零干涉 | 同层相邻件、相邻层上下件:采样分类 + Common 体积 = 0(抽样:每 floor 类型 1 层全查) | +| V3 | 运输尺寸 | 每板型 tight bbox ≤ 1600 x 4200 x 600(宽 x 高 x 深) | +| V4 | 窗墙比 | Σ(实例 × tag 玻璃面面积) / 朝向毛立面积(标准层板带),与目标差 ≤ 0.03 | +| V5 | 竖挺 | 竖挺侧面法向实测角 = bin 角 ± 0.05°;挺尖离 building line ≤ frame_d + fin_depth + 1 | +| V6 | 板型数 | 标准板型(vision + solid,w_std × floor_h)= 2,竖挺件 ≤ K;48 层与 8 层标准板型集合相同 | +| V7 | 角件 | 凸/凹角件为单实体、外轮廓与两侧板带外面共面(± 1e-3) | +| V8 | 楼层与退台 | 每层 z 标高、tier 退台深度、女儿墙位于 tier 屋面边 | +| V9 | 增量 | fin_depth 改动:miss 集合 = 竖挺件;n_floors 改动:板型全 hit;装配 solve 报告符合预期 | +| V10 | 导出 | 新进程重开 scadpkg:体积和 / 实例数 / 定义数一致;STEP occurrence 数 = 实例数 | + +## 假设(需要报告的) + +- A1 板件是"外观级"单元板:框 + 玻璃 + 层间板合为一个实体(Part 只含 1 个 Solid),不分铝/玻璃材质; + 不含锚件、密封胶、排水,不做结构/热工/风压分析(manufacturing-boundaries)。 +- A2 幕墙固定于结构,不建连接件约束:placement 由布局基准计算,全部 ground(intent ladder: placement tied to named datum)。 +- A3 building line 即楼板外沿参考线;板件在其外侧;楼板内缩 slab_gap = 30,楼层板占 [level, level + slab_t](藏在层间板后); + 屋面板占 [roof − slab_t, roof](顶面 = 屋面 / 退台面,藏在顶层板上沿后);上 tier 首层立在下 tier 屋面板上 + (其板件底 = roof + joint/2;若屋面板也取 [roof, roof + slab_t],会在上 tier building line 外被上 tier 首层板件穿过 — S5 规划时发现,S3 K3 补 terrace 检查 + KB10)。 +- A4 退台四边同距内退,保持平面形状;任何边内退后长度不足(< 2·corner_c + closer_min·2)时布局报错而非降级。 +- A5 收口板两端对称分布;收口板为实体板、无竖挺。 +- A6 朝北边无竖挺;竖挺位于每块板右侧竖框中线(沿边正向的末端),为独立的现场安装件: + 固定在板上时 45° 挺使单元宽约 1676 > 1600(V3),且 fin_depth 只应影响竖挺件(V9)。 +- A7 板型身份取参数到 0.001 mm 的四舍五入值(与上次讨论一致:身份用离散化,闭合与检查用精确值 + 容差)。 +- A8 渲染为灰度实体(玻璃不透明),用于形态评审,不是效果图。 diff --git a/examples/pcg_facade_tower/SDK_DEFECTS.md b/examples/pcg_facade_tower/SDK_DEFECTS.md new file mode 100644 index 00000000..d2c86644 --- /dev/null +++ b/examples/pcg_facade_tower/SDK_DEFECTS.md @@ -0,0 +1,156 @@ +# SDK 设计缺陷记录(pcg_facade_tower 构建过程中发现) + +目的:把 PCG 建筑尺度的例子当作压力测试,记下每处「SDK 本身设计上的问题」——症状、触发条件、根因、 +当前处置、修复方向——之后据此对症修复。末尾「启发」一节把单条缺陷归纳成可复用的排查规则 +(下次在别处先按这些规则找同类问题)。 + +状态:`已修(未提交)` = 工作区里有补丁 + 回归测试,未 commit;`绕开` = 例子侧规避,SDK 未改;`待修` = 只记录。 + +规模参照:默认 36 层 CHAMFER 塔 = 26 板型 Part、16 个带子装配(每个 70–250 构件)、塔楼 79 构件 / 20 定义、 +共 3697 个外立面件;楼板 36 m × 36 m。 + +--- + +## D1 `OperationGraph.is_dag` 递归 DFS → 长操作链 RecursionError + +- 状态:已修(未提交)— `src/simplecadapi/topology/model.py` +- 症状:单层装配 `add_component_rassembly` 约 1000 次后抛 `RecursionError`。 +- 根因:每次 add 是 feature graph 上的一个节点,链长 = 构件数;`is_dag` 用递归 DFS,深度 = 链长。 +- 修复:`_kahn_order()` 迭代 Kahn,`is_dag` / `topological_order` 共用(后者原本还先跑一遍 DFS 再跑 Kahn)。 + 顺带把 `queue.pop(0)`(O(N))换成 `deque.popleft()`。 +- 缺:没有「≥ 数千节点链」的回归测试。 + +## D2 id 去重用 `list.count` → 每次 add O(N²) + +- 状态:已修(未提交)— `product/assembly.py`、`product/connector.py`、`product/constraint.py` +- 症状:3000 实例平铺装配 69 s;修后 12.6 s。 +- 根因:`Assembly.__post_init__` 每次构造(不可变值,每 add 一次重建)都 `ids.count(id)` 查重 → 单次 O(N²),整条链 O(N³)。 +- 修复:`Counter`。 +- 遗留:不可变 Assembly 每 add 整体重建 + 全量校验本身仍是每次 O(N),整链 O(N²); + 应提供批量 API(`add_components_rassembly(components=[...])`)或增量校验。 + +## D3 几何指纹量化整数超出 JSON 安全整数范围 + +- 状态:已修(未提交)— `artifacts/geometry_interface.py`;回归测试 + `test/test_geometry_summary.py::test_building_scale_part_hashes_and_round_trips_its_state` +- 症状:36 m 楼板 Part 建型后求指纹失败(哈希被 JSON 安全整数检查拒绝)。 +- 根因:指纹把体积 / 面积 / 坐标按 1e-7 量化成 int;36e3² × 250 / 1e-7 ≈ 3e18 > 2^53。 + 量化步长是**绝对**的,隐含了「零件尺度」假设。 +- 修复:`_json_safe` 在哈希前把超界 int 编码为 `"int:<十进制>"`;范围内的值与旧哈希一致(不失效既有缓存)。 +- 更好的方向:量化步长相对于包围盒对角线(与 `geometry_summary` 的相对容差一致),根本不产生这种量级。 + +## D4 RFC 8785 状态文件读回时拒绝大整值 double + +- 状态:已修(未提交)— `scene/canonical.py`(同 D3 回归测试) +- 症状:写入 `latest-parts.json` 成功,下次读取时报越界整数。 +- 根因:JCS 把 < 1e21 的整值 double(楼板惯量 ≈ 1.18e19)打印成无指数的整数 token + `11773562012270215000`;`parse_strict_json` 按 Python int 读回 → 超 2^53 被拒 / 重新规范化不一致。 + 即「写」和「读」对数字域的约定不对称。 +- 修复:`parse_canonical_json` 用 `parse_int=_jcs_int`,超界整数 token 读成 double。 + +## D5 面 tag 经变换 / 后续布尔后退到 lineage 作用域,默认查询查不到 + +- 状态:绕开 — 例子把玻璃 tag 放在建型最后一步;渲染高亮用板局部坐标;V4 用「定义体 tag 面积 × 实例数」。 +- 症状:`translate` / `rotate` 或其后布尔之后,`ql.tag(...)`(默认 effective)返回空。 +- 根因:tag 绑定在具体面上,变换产生新面后只在 lineage 中可追溯;effective 作用域不跟随纯刚体变换。 +- 影响:装配展平(`make_compound_from_assembly_rcompound`)后的整楼上无法按 tag 选玻璃面—— + 「按语义选面」在装配层失效,而这恰是 PCG 统计(WWR)最需要的。 +- 修复方向:纯刚体变换应保持 effective tag(面一一对应,无歧义);或装配投影时按实例 placement 转发定义体 tag。 + +## D6 `@scad.part` 的 part_id 必须等于装饰器 id → 参数化族需要工厂写法 + +- 状态:绕开 — `scad.part(id=type_id, revision=..., project_root=ROOT)(builder)(**kwargs)`,每个板型动态造一个装饰器。 +- 根因:Part 身份 = 装饰器 id,而 PCG 的「类型」是运行时由参数算出来的(`solid-w1600-h3600`), + 装饰器在 import 时就要定 id。 +- 修复方向:官方支持 `part_family` / `id=lambda **kw: ...`,或文档化工厂写法作为推荐模式。 + +## D7 装配 geometry_summary 递归内嵌子摘要 + 每次 assemble 全量读写状态文件 → warm 比 cold 慢 + +- 状态:待修(本分支 commit 8b218d4 引入的摘要设计) +- 症状:塔楼 cold 构建 31 s,**warm 49 s**(无任何改动的重建反而更慢)。 +- 证据:`.simplecad/state/latest-assemblies.json` 4.7 MB,其中 facade-tower 一条 3.6 MB + (`public_interface.geometry_summary.instances` 2.6 MB、`dependency_interfaces` 1.0 MB)。 + profiler(~114 s 含开销):`load_latest_assembly_state` 57 s / 34 次,`canonical_json_bytes` 60 s, + `update_latest_assembly_state` 29 s,part cache 读取 22 s,`validate_assembly_definition_graph` 17 s。 +- 根因(两层叠加): + 1. `assembly_geometry_summary`(`artifacts/geometry_summary.py`,调用处 `build/assembly_builder.py` + `_assembly_geometry_summary`)把每个子定义的**完整摘要**按实例复制进父摘要:塔楼 ~40 个 floor 实例 × + 每个带摘要 50–115 KB。同一定义被实例化 N 次就存 N 份,嵌套再乘一层。 + 2. 每次 `assemble` 都把整个状态文件解析 + JCS 规范化校验一遍,写回时再全量序列化 → 代价 ∝ 调用次数 × 全项目状态大小, + 与本次改动无关。 +- 修复方向: + - 摘要里实例只存 `(instance_id, definition_id, placement)`,子摘要按 `definition_id` 去重存一份 + (或只存子摘要 hash,等价判定时按引用取);`geometry_summaries_equivalent` 相应按引用比较。 + - 状态存储按条目分文件(`state/assemblies/.json`)或进程内缓存 + 只写脏条目。 +- 需要的回归测试:N 个同定义实例的父摘要大小不随 N 线性增长;warm 重建耗时 ≤ cold。 +- S5 复测(z 区间窗口版 gate):塔楼 warm 构建 47.2 s、再 warm 45.8 s(零改动),而 3697 件的 S5 全部几何检查才 169 s —— + 一次「什么都没变」的重建占到完整验证的 ~1/4。S6 扫描 6 座塔 / S7 六步各付一次这个代价。 + +## D8 增量基线是「每个 assembly id 全项目唯一的 latest 槽」→ 参数族 / 多进程互相覆盖基线 + +- 状态:待修(设计层面) +- 症状:`solve_report.dirty_instances` / `geometry_dirty_instances` 的对比对象是 `latest-assemblies.json` 里该 + assembly id 的**最后一次**构建,不论是谁、以什么参数建的。S6 在同一 id `facade-tower` 下依次建 8/20/36/48 层 + + RECT/L_SHAPE,每次都把上一座当基线 → 报告的是「和上一个扫描点的差」,不是「和这组参数上次的差」;两个进程 + (例如 S6 扫描与 S7 增量 gate)同时跑时,彼此的基线在中途被替换,dirty 报告不可复现。 + 状态文件本身有 O_EXCL 锁(`artifacts/interface.py` `_state_lock`),所以不会写坏,但**语义**上互相污染。 +- 对照:part 缓存按 build_key 内容寻址,所有变体并存、回退即命中 —— 同一 SDK 里 part 层可以多变体、装配层只有一个槽。 +- 触发:PCG 参数族(同一 id 多参数集)、CI 并行、notebook 与脚本并行。 +- 修复方向:基线槽按 (assembly id, build_key/参数指纹) 分;或 `assemble(..., baseline=…)` 显式给出对比对象 + (上一次同参数 / 指定 build);`solve_report` 里写出基线来自哪次构建(build_key + 时间),让报告可解释。 +- 需要的回归测试:同一 id 交替构建参数 A、B、A → 第三次对 A 报告零 dirty。 +- 规避(本例):几何 gate 串行运行;S7 在同一进程里自建基线链(prime 步只建立基线、不判定)。 + +## D9 读 .scadpkg 的代价 ∝ 实例数 × 重复规范化 / 哈希 / schema 校验(读 20 s,materialize 只要 2.5 s) + +- 状态:待修 +- 症状:可行性探针的平铺包(12 板型 × 3000 实例,单层装配)在新进程里 `read_product_package` 20 s(profiler 下 40.7 s), + 其后 `materialize_definition` 仅 2.5 s —— 读包比把几何建出来还贵一个量级。 +- profiler(`read_product_package`,40.7 s): + - `_decode_definitions` 38.4 s;其中 `canonical_bytes` 5401 次 / 22.9 s、`content_hash` 3913 次 / 15.0 s + (次数 ≈ 实例数,而不是定义数);rfc8785 `dump` 递归 744 万次。 + - `validate_assembly_definition_graph` 20.1 s(读包时整图再验一遍,而 `_mark_package_validated` 之后 materialize 又查一次标记)。 + - `load_feature_graph_artifact` 13 次 / 17.2 s(`FeatureGraph.from_dict` 12.7 s、`__post_init__` 8.5 s)。 + - jsonschema `validate_manifest` 53 次 / 11.7 s(per-item `items` / `ref` 递归 58 万次)。 +- 根因:读路径把「完整性」拆成了逐对象、逐实例的重复工作:每个 component / placement 记录单独 JCS 规范化 + 哈希, + 同一份内容在 decode、图校验、feature graph 构造里各算一遍;schema 校验对大数组逐项走完整 `$ref` 解析。 +- 修复方向: + - 每个 blob 只按 zip 成员哈希一次(manifest 已记内容 hash),decode 后的派生对象不再重算 `content_hash`,缓存 canonical bytes。 + - 读包路径一次图校验,结果随对象携带(已有 `_validated` 标记的思路,推广到 assembly graph / feature graph)。 + - 实例数组用紧凑 schema(或跳过逐项 jsonschema、用类型化解码代替)。 +- 需要的回归测试:读包耗时对实例数近似线性且常数小(例如 3000 实例 < 2 s);同一 blob 在一次读中只哈希一次。 + +## D10 SDK 自己的输出类型不被兄弟 API 接受:`make_compound_from_assembly_rcompound` → `render_screenshot_rpath` 报错 + +- 状态:待修(小,但每次都撞) +- 症状:`render_screenshot_rpath(shapes=[scad.make_compound_from_assembly_rcompound(assembly=asm)])` → + `ValueError: render_screenshot_rpath supports Solid or raw TopoDS_Shape inputs`;要手动 `.wrapped` 降到 OCP 原始类型。 + 而且错误在构建 + 展平 3700 件(~5 min 的整个渲染脚本)之后才抛出。 +- 根因:渲染入口按 `Solid | TopoDS_Shape` 白名单判型,没有覆盖 SDK 自己的 `Compound` / `Shell` / `Face` 包装类型; + 没有「SDK 返回的几何值都可直接喂给 inspect / render」的类型闭包约定。 +- 修复方向:渲染 / 测量入口统一接受任何带 `.wrapped` 的 SDK 形状包装(或一个 `ShapeLike` 协议);输入判型放在最前面。 +- 需要的回归测试:对 SDK 每个返回形状的 `make_*` / `*_rcompound`,结果都能直接 render / measure。 + +--- + +## 启发(排查规则) + +1. **尺度假设**:凡是「绝对」量化步长 / 容差(1e-7、JSON 2^53、float→int)都要问:100 m 级、1e5 件级时还成立吗? + 优先相对于包围盒的容差。(D3、D4) +2. **读写对称**:序列化规范(JCS)写出来的每一种 token,解析器都必须按同一数域读回;给每种持久化格式做一次 + 极值 round-trip 测试。(D4) +3. **与用户规模成正比的递归**:图遍历、链式 feature、嵌套装配——深度随用户输入增长的地方一律迭代实现。(D1) +4. **不可变值 × 逐项追加**:每次追加都重建 + 全量校验 → 整链 O(N²);校验里再有 O(N) 查找就是 O(N³)。 + 找所有 `__post_init__` 中的 `.count` / `in list` / 全量扫描,并提供批量构造入口。(D2) +5. **实例化 ≠ 复制**:任何「按实例」记录的派生数据(摘要、接口、依赖)都应按定义去重、按引用链接; + 否则大小 ∝ 实例数 × 嵌套深度。(D7) +6. **缓存命中路径的代价**:命中路径必须 ≤ 未命中路径;凡是命中时仍要读 / 解析 / 规范化全局状态的,按项目规模退化。 + 给 warm/cold 耗时比加基准测试。(D7) +7. **语义标签要跟随刚体变换**:tag / 选择器在变换、装配投影后仍应可用,否则语义层在装配层失效。(D5) +8. **运行时类型族**:PCG 的类型是算出来的,身份(id)不能只能在 import 时声明。(D6) +9. **缓存各层的键要一致**:part 层内容寻址(多变体并存)、装配层 id 单槽(后写覆盖)——同一个「增量」概念在两层 + 语义不同,参数族与并行一来就暴露。凡是 “latest” 语义的全局状态,都要问:谁的 latest?(D8) +10. **完整性检查只做一次**:内容哈希 / 规范化 / schema 校验在一次读写里按「对象」计次而不是按「引用」计次; + 给每条 I/O 路径数一下同一 blob 被哈希了几次。验证结果要能随对象携带,别让下游再验。(D7、D9) +11. **API 类型闭包**:SDK 任一函数的返回值,应能直接作为其它 SDK 函数的同类输入;判型白名单要从「SDK 输出类型全集」 + 生成,不是手写。(D10) diff --git a/examples/pcg_facade_tower/corners.py b/examples/pcg_facade_tower/corners.py new file mode 100644 index 00000000..a50dc305 --- /dev/null +++ b/examples/pcg_facade_tower/corners.py @@ -0,0 +1,39 @@ +"""pcg_facade_tower corner pieces: one Part per (turn, height) type from the layout schedule. + +Corner-local frame (BUILD_PLAN): origin = building-line vertex, x = incoming edge tangent, y up (0 = band level), +z = incoming outward normal. The plan polygon (layout.corner_profile_local) is bounded by the building line, +both panel bands' outer faces (offset frame_d) and the two band end lines at corner_c - joint/2 from the vertex, +so the piece sits one joint off each neighbouring panel. Convex (turn > 0) and reflex (turn < 0) share the builder. +""" +from __future__ import annotations + +from types import SimpleNamespace + +import simplecadapi as scad + +import layout as L +import panels as P + + +def corner_section(turn: float, corner_c: float, frame_d: float, joint: float) -> list[tuple[float, float]]: + return L.corner_profile_local(turn, SimpleNamespace(corner_c=corner_c, frame_d=frame_d, joint=joint)) + + +def build_corner(*, turn: float, h: float, corner_c: float, frame_d: float, joint: float): + pts = corner_section(turn, corner_c, frame_d, joint) + + # ---- feature: corner-post (build, profile=sketch) ---- + # XZ sketch: (u, v) -> corner-local (x, z); extruded up the band inside the joint + sk = P.polygon_loop(scad.make_sketch_rsketch(name="corner-post", plane="XZ"), "c", pts) + face = scad.make_face_from_sketch_rface(sketch=sk, profile="c_l0", require_fully_constrained=True) + post = scad.extrude_rsolid(profile=face, direction=(0.0, 1.0, 0.0), distance=h - joint) + return scad.translate_shape(shape=post, vector=(0.0, joint / 2.0, 0.0)) + + +def builder_args(spec: dict, p: L.FacadeParams) -> tuple: + return build_corner, dict(turn=spec["turn"], h=spec["h"], corner_c=p.corner_c, frame_d=p.frame_d, joint=p.joint) + + +def make_corner_part(type_id: str, spec: dict, p: L.FacadeParams): + builder, kwargs = builder_args(spec, p) + return scad.part(id=type_id, revision="1.0.0", project_root=P.ROOT)(builder)(**kwargs) diff --git a/examples/pcg_facade_tower/export.py b/examples/pcg_facade_tower/export.py new file mode 100644 index 00000000..e0793b82 --- /dev/null +++ b/examples/pcg_facade_tower/export.py @@ -0,0 +1,80 @@ +"""pcg_facade_tower export: product package, AP242 STEP (shared definitions), panel schedule CSV, hero render. + + ../../.venv/bin/python export.py [rect|chamfer|l_shape] [n_floors] + +out/.scadpkg the tower closure (tower -> bands -> panel / fin / corner types; slabs, canopy) +out/.step XCAF assembly: every definition written once, every occurrence a located reference +out/_panels.csv one row per facade piece type (type_id, family, sizes, count) — the fabrication list +out/.png iso from the south-west +""" +from __future__ import annotations + +import csv +import math +import sys +import time +from pathlib import Path + +import simplecadapi as scad + +import layout as L +import tower as T + +OUT = Path(__file__).resolve().parent / "out" +CSV_FIELDS = ("type_id", "family", "w_mm", "h_mm", "spandrel_mm", "fin_angle_deg", "corner_turn_deg", "count") + + +def panel_rows(sched: L.FacadeSchedule) -> list[dict]: + counts = sched.stats["instances_by_type"] + rows = [] + for tid in sorted(sched.types): + spec = sched.types[tid] + rows.append({"type_id": tid, "family": spec["family"], "w_mm": spec.get("w", ""), "h_mm": spec["h"], + "spandrel_mm": spec.get("spandrel", ""), "fin_angle_deg": spec.get("angle", ""), + "corner_turn_deg": spec.get("turn", ""), "count": counts[tid]}) + return rows + + +def write_csv(sched: L.FacadeSchedule, path: Path) -> Path: + with path.open("w", newline="") as fh: + writer = csv.DictWriter(fh, fieldnames=CSV_FIELDS) + writer.writeheader() + writer.writerows(panel_rows(sched)) + return path + + +def export(sched: L.FacadeSchedule, stem: str = "facade_tower", render: bool = True) -> dict: + OUT.mkdir(exist_ok=True) + timings = {} + start = time.perf_counter() + result = T.make_tower(sched) + timings["build"] = time.perf_counter() - start + package = OUT / f"{stem}.scadpkg" + start = time.perf_counter() + scad.capture(result, package, include_scene=False) # the scene projection of 3700 pieces is not needed here + timings["capture"] = time.perf_counter() - start + start = time.perf_counter() + step = scad.exporter.export_product_package_to_step(package, OUT / f"{stem}.step") + timings["step"] = time.perf_counter() - start + paths = {"scadpkg": package, "step": step.output_path, "csv": write_csv(sched, OUT / f"{stem}_panels.csv")} + if render: + start = time.perf_counter() + whole = scad.make_compound_from_assembly_rcompound(assembly=result.value).wrapped + paths["png"] = Path(scad.render_screenshot_rpath( + shapes=[whole], output_path=str(OUT / f"{stem}.png"), view=(20.0, 225.0), view_up=(0.0, 0.0, 1.0), + show_callouts=False, show_legend=False)) + timings["render"] = time.perf_counter() - start + return {"result": result, "step_report": step, "paths": paths, "timings": timings} + + +if __name__ == "__main__": + kind = L.PlanKind(sys.argv[1]) if len(sys.argv) > 1 else L.PlanKind.CHAMFER + n = int(sys.argv[2]) if len(sys.argv) > 2 else None + params = (L.default_params(plan_kind=kind) if n is None else + L.default_params(plan_kind=kind, n_floors=n, setback_every=math.ceil(n / 3))) + s = L.build_schedule(params) + out = export(s, stem="facade_tower" if n is None and kind is L.PlanKind.CHAMFER else f"facade_tower_{kind.value}_{s.params.n_floors}f") + for name, path in out["paths"].items(): + print(f"{name:8s} {path} ({Path(path).stat().st_size / 1e6:.1f} MB)") + print(f"{out['step_report'].occurrence_count} STEP occurrences, {len(out['step_report'].definition_ids)} definitions; " + + ", ".join(f"{k} {v:.1f}s" for k, v in out["timings"].items())) diff --git a/examples/pcg_facade_tower/floor.py b/examples/pcg_facade_tower/floor.py new file mode 100644 index 00000000..7ead8444 --- /dev/null +++ b/examples/pcg_facade_tower/floor.py @@ -0,0 +1,67 @@ +"""pcg_facade_tower band subassemblies: one `scad.assemble` definition per schedule band. + +A band (tier x phase floor band, the lobby, a tier's parapet) is realized many times up the tower, so it is built once +in band-local coordinates (plan axes = world, z = 0 at the band's level) and the tower places it by level. +Contents: every panel, fin and corner piece of the band, placed from the layout frames and grounded (A2); the lobby +holds its stacked rows. Slabs and the canopy are placed by the tower, not here: a tier's first floor stands on the roof +below, so a slab is not a property of the floor band. + +Component ids: r{row}-e{edge}-s{slot} (panel), r{row}-e{edge}-s{slot}-fin, r{row}-v{vertex} (corner). +""" +from __future__ import annotations + +import simplecadapi as scad + +import corners as C +import layout as L +import panels as P + + +def band_assembly_id(band_id: str) -> str: + return f"band-{band_id}" + + +def band_components(sched: L.FacadeSchedule, band: dict) -> list[dict]: + """[{component_id, type_id, frame}] in band-local coordinates (layout frames at the in-band row offsets).""" + out = [] + for row in range(band["rows"]): + z = row * band["height"] + out += [{"component_id": f"r{row}-e{r['edge']}-s{r['slot']}", "type_id": r["type_id"], + "frame": L.panel_frame(sched, band, r, z)} for r in band["panels"]] + out += [{"component_id": f"r{row}-e{r['edge']}-s{r['slot']}-fin", "type_id": r["type_id"], + "frame": L.fin_frame(sched, band, r, z)} for r in band["fins"]] + out += [{"component_id": f"r{row}-v{r['vertex']}", "type_id": r["type_id"], + "frame": L.corner_frame(sched, band, r, z)} for r in band["corners"]] + return out + + +def type_parts(sched: L.FacadeSchedule, type_ids) -> dict: + """type id -> PartBuildResult (content-cached Part factories).""" + out = {} + for tid in sorted(set(type_ids)): + spec = sched.types[tid] + make = C.make_corner_part if spec["family"] == "corner" else P.make_panel_part + out[tid] = make(tid, spec, sched.params) + return out + + +def make_band_assembly(sched: L.FacadeSchedule, band_id: str) -> scad.AssemblyBuildResult: + band = sched.band(band_id) + comps = band_components(sched, band) + parts = type_parts(sched, (c["type_id"] for c in comps)) + aid = band_assembly_id(band_id) + + @scad.assemble(id=aid, revision="1.0.0", definitions=tuple(parts.values()), project_root=P.ROOT) + def build(band_id: str) -> scad.Assembly: + # ---- feature: band-components (assemble) ---- + # every piece placed from its layout frame (x = edge tangent, y = up, z = outward) and grounded + asm = scad.make_assembly_rassembly(assembly_id=aid, name=f"facade band {band_id}") + for c in comps: + f = c["frame"] + asm = scad.add_component_rassembly( + assembly=asm, item=parts[c["type_id"]].value, component_id=c["component_id"], + placement=scad.make_placement_rplacement(origin=f["origin"], x_axis=f["x_axis"], y_axis=f["y_axis"])) + asm = scad.ground_component_rassembly(assembly=asm, component_id=c["component_id"]) + return asm + + return build(band_id=band_id) diff --git a/examples/pcg_facade_tower/layout.py b/examples/pcg_facade_tower/layout.py new file mode 100644 index 00000000..8b4305ce --- /dev/null +++ b/examples/pcg_facade_tower/layout.py @@ -0,0 +1,719 @@ +"""PCG layout engine: plan -> setback tiers -> per-edge module subdivision -> panel schedule. + +Pure data, no geometry. Every geometric file consumes the FacadeSchedule this module emits; this is the one +place where the procedural rules live (subdivision, closers, corners, fin wave field + quantization, ordered +dithering for the window-to-wall ratio, type and floor-type rationalization). + +Frames (BUILD_PLAN datum): + world Z up, +X east, +Y north, origin = ground level at the plan's SW corner; plan polygons are CCW. + edge i from vertex i to i+1, tangent t_i, outward normal n_i = (t_y, -t_x). + panel local x along the edge (0 = left module boundary), y up (0 = level), z outward (0 = building line). + placement: origin = V_i + s0*t_i + level*Z, x_axis = t_i, y_axis = Z -> z_axis = t_i x Z = n_i. + corner local x = incoming tangent, y up, z = incoming normal; origin = the building-line vertex. + fin panel orientation; origin = right-jamb centreline on the frame outer face (panel-local + (w - joint/2 - frame_sight/2, joint/2, frame_d)). Fins are separate site-attached Parts: fixed to the + panel, a 45 deg fin pushes the unit to ~1676 mm wide, past the 1600 transport envelope (V3). +""" +from __future__ import annotations + +import json +import math +from dataclasses import asdict, dataclass, field, replace +from enum import Enum +from typing import Any + +import simplecadapi as scad + +# ---- params ---- +PLAN_W = scad.var("plan_w", 36000.0, comment="平面 X 外包(东西)", unit="mm") +PLAN_D = scad.var("plan_d", 24000.0, comment="平面 Y 外包(南北)", unit="mm") +CHAMFER = scad.var("chamfer", 6000.0, comment="CHAMFER:NE 角沿两边各切", unit="mm") +NOTCH_W = scad.var("notch_w", 12000.0, comment="L_SHAPE:NE 缺口 X 宽", unit="mm") +NOTCH_D = scad.var("notch_d", 9000.0, comment="L_SHAPE:NE 缺口 Y 深", unit="mm") +N_FLOORS = scad.var("n_floors", 36, comment="lobby 之上的标准层数") +FLOOR_H = scad.var("floor_h", 3600.0, comment="标准层高", unit="mm") +LOBBY_H = scad.var("lobby_h", 5400.0, comment="首层 lobby 层高", unit="mm") +SETBACK_EVERY = scad.var("setback_every", 12, comment="每 tier 层数") +SETBACK_DEPTH = scad.var("setback_depth", 3000.0, comment="每 tier 四边内退", unit="mm") +PARAPET_H = scad.var("parapet_h", 1200.0, comment="女儿墙高", unit="mm") +W_STD = scad.var("w_std", 1500.0, comment="标准板模数宽(含缝)", unit="mm") +CLOSER_MIN = scad.var("closer_min", 450.0, comment="收口板最小模数宽(含缝)", unit="mm") +JOINT = scad.var("joint", 20.0, comment="板缝(四周各 joint/2)", unit="mm") +CORNER_C = scad.var("corner_c", 450.0, comment="角件沿各边占宽(自 building line 顶点)", unit="mm") +FRAME_D = scad.var("frame_d", 150.0, comment="框深(building line 外)", unit="mm") +FRAME_SIGHT = scad.var("frame_sight", 60.0, comment="框面宽", unit="mm") +SPANDREL_H = scad.var("spandrel_h", 1100.0, comment="层间实体区高", unit="mm") +GLASS_T = scad.var("glass_t", 24.0, comment="玻璃厚", unit="mm") +GLASS_RECESS = scad.var("glass_recess", 40.0, comment="玻璃外面距框外面凹进", unit="mm") +FIN_T = scad.var("fin_t", 40.0, comment="竖挺厚", unit="mm") +FIN_DEPTH = scad.var("fin_depth", 300.0, comment="竖挺伸出深度(自框外面)", unit="mm") +FIN_AMP = scad.var("fin_amp", 30.0, comment="波场幅值", unit="deg") +FIN_WAVELENGTH = scad.var("fin_wavelength", 18000.0, comment="波场沿周长波长", unit="mm") +FIN_PERIOD_FLOORS = scad.var("fin_period_floors", 4, comment="波场 / 抖动竖向周期(层),须为 4 的倍数") +FIN_BINS = scad.var("fin_bins", 6, comment="竖挺角量化档数 K(合理化旋钮)") +SUN_AZIMUTH = scad.var("sun_azimuth", 180.0, comment="太阳方位角(自北顺时针)", unit="deg") +SLAB_T = scad.var("slab_t", 300.0, comment="楼板厚", unit="mm") +SLAB_GAP = scad.var("slab_gap", 30.0, comment="楼板外沿距 building line 内缩", unit="mm") +CANOPY_MODULES = scad.var("canopy_modules", 6, comment="南向入口雨棚跨越的标准模数(奇偶自动对齐到板缝)") +CANOPY_DEPTH = scad.var("canopy_depth", 3000.0, comment="雨棚外挑(自板外面 + 缝)", unit="mm") +CANOPY_T = scad.var("canopy_t", 250.0, comment="雨棚厚", unit="mm") + +FIN_LIMIT = 45.0 # 竖挺角范围 [-45°, 45°](0 = 垂直立面) +SUN_THETA_LIMIT = 30.0 # 朝向基准角 θ_sun 的限幅 +FIN_FACING_MIN = -0.2 # n·sun > -0.2 的边带竖挺(E/W/S),其余(N、NE 切角)无挺 +TYPE_ROUND_DIGITS = 3 # 板型身份:宽/角四舍五入到 0.001(A7) +WWR_TOL = 0.03 +MAX_PANEL_H = 4200.0 # transport envelope height (V3); taller bands (lobby) split into stacked rows +BAYER4 = ((0, 8, 2, 10), (12, 4, 14, 6), (3, 11, 1, 9), (15, 7, 13, 5)) + + +class PlanKind(str, Enum): + RECT = "rect" + CHAMFER = "chamfer" + L_SHAPE = "l_shape" + + +class Band(str, Enum): + LOBBY = "lobby" + TOWER = "tower" + PARAPET = "parapet" + + +def _value(value: object) -> float: + evaluate = getattr(value, "evaluate", None) + return float(evaluate()) if callable(evaluate) else float(value) + + +@dataclass(frozen=True) +class FacadeParams: + plan_kind: PlanKind = PlanKind.CHAMFER + plan_w: float = _value(PLAN_W) + plan_d: float = _value(PLAN_D) + chamfer: float = _value(CHAMFER) + notch_w: float = _value(NOTCH_W) + notch_d: float = _value(NOTCH_D) + n_floors: int = int(_value(N_FLOORS)) + floor_h: float = _value(FLOOR_H) + lobby_h: float = _value(LOBBY_H) + setback_every: int = int(_value(SETBACK_EVERY)) + setback_depth: float = _value(SETBACK_DEPTH) + parapet_h: float = _value(PARAPET_H) + w_std: float = _value(W_STD) + closer_min: float = _value(CLOSER_MIN) + joint: float = _value(JOINT) + corner_c: float = _value(CORNER_C) + frame_d: float = _value(FRAME_D) + frame_sight: float = _value(FRAME_SIGHT) + spandrel_h: float = _value(SPANDREL_H) + glass_t: float = _value(GLASS_T) + glass_recess: float = _value(GLASS_RECESS) + fin_t: float = _value(FIN_T) + fin_depth: float = _value(FIN_DEPTH) + fin_amp: float = _value(FIN_AMP) + fin_wavelength: float = _value(FIN_WAVELENGTH) + fin_period_floors: int = int(_value(FIN_PERIOD_FLOORS)) + fin_bins: int = int(_value(FIN_BINS)) + sun_azimuth: float = _value(SUN_AZIMUTH) + slab_t: float = _value(SLAB_T) + slab_gap: float = _value(SLAB_GAP) + canopy_modules: int = int(_value(CANOPY_MODULES)) + canopy_depth: float = _value(CANOPY_DEPTH) + canopy_t: float = _value(CANOPY_T) + # glass / gross per orientation; ceiling ~0.54 (frames + spandrel + solid closers), south lowest for solar gain + wwr_target: tuple = (("N", 0.50), ("E", 0.40), ("S", 0.35), ("W", 0.40)) + + def to_dict(self) -> dict: + data = asdict(self) + data["plan_kind"] = self.plan_kind.value + data["wwr_target"] = dict(self.wwr_target) + return data + + +def default_params(**overrides: Any) -> FacadeParams: + return replace(FacadeParams(), **overrides) + + +# ---------------------------------------------------------------- guards + + +class LayoutError(ValueError): + """Infeasible parameter set (raised instead of silently degrading the layout).""" + + +def assert_params(p: FacadeParams) -> None: + def need(ok: bool, message: str) -> None: + if not ok: + raise LayoutError(message) + + positive = ("plan_w", "plan_d", "floor_h", "lobby_h", "parapet_h", "w_std", "closer_min", "joint", "corner_c", + "frame_d", "frame_sight", "glass_t", "fin_t", "fin_depth", "fin_wavelength", "slab_t") + for name in positive: + need(math.isfinite(getattr(p, name)) and getattr(p, name) > 0.0, f"{name} must be positive") + need(p.n_floors >= 1 and p.setback_every >= 1, "n_floors / setback_every must be >= 1") + need(p.setback_depth >= 0.0 and p.slab_gap >= 0.0, "setback_depth / slab_gap must be >= 0") + need(p.fin_bins >= 2, "fin_bins must be >= 2") + need(p.fin_period_floors >= 4 and p.fin_period_floors % 4 == 0, "fin_period_floors must be a multiple of 4") + need(p.closer_min > p.joint + 2.0 * p.frame_sight, "closer_min must leave a frame inside the joint") + need(p.closer_min < p.w_std, "closer_min must be < w_std") + need(p.corner_c > p.frame_d + p.joint, "corner_c must exceed frame_d + joint (concave corner bands overlap)") + need(p.spandrel_h + 2.0 * p.frame_sight + p.joint < p.floor_h, "spandrel_h leaves no vision opening") + need(p.glass_recess + p.glass_t < p.frame_d, "glass must sit inside the frame depth") + need(p.fin_t < p.w_std / 2.0, "fin_t too thick for the module") + need(p.floor_h <= MAX_PANEL_H and p.parapet_h <= MAX_PANEL_H, "floor_h / parapet_h exceed the transport height") + # slab occupies [level, level + slab_t] and must hide behind the spandrel (A3); the parapet hides the roof slab + need(p.slab_t < p.spandrel_h - p.frame_sight / 2.0, "slab_t shows below the spandrel") + need(p.slab_t < p.parapet_h - p.joint / 2.0 - p.frame_sight, "slab_t shows above the parapet") + need(p.slab_gap > 0.0, "slab_gap must keep the slab off the building line") + need(p.canopy_modules >= 1 and p.canopy_depth > 0.0 and p.canopy_t > 0.0, "canopy size") + need(p.canopy_t < p.lobby_h / math.ceil(p.lobby_h / MAX_PANEL_H - 1.0e-9), "canopy_t taller than a lobby row") + need(0.0 <= p.fin_amp <= FIN_LIMIT, "fin_amp must lie in [0, 45]") + if p.plan_kind is PlanKind.CHAMFER: + need(0.0 < p.chamfer < min(p.plan_w, p.plan_d), "chamfer must lie inside the plan") + if p.plan_kind is PlanKind.L_SHAPE: + need(0.0 < p.notch_w < p.plan_w and 0.0 < p.notch_d < p.plan_d, "notch must lie inside the plan") + need(all(0.0 < value <= 1.0 for _, value in p.wwr_target), "wwr targets must lie in (0, 1]") + + +# ---------------------------------------------------------------- plan + tiers + + +def base_plan(p: FacadeParams) -> list[tuple[float, float]]: + w, d = p.plan_w, p.plan_d + if p.plan_kind is PlanKind.RECT: + return [(0.0, 0.0), (w, 0.0), (w, d), (0.0, d)] + if p.plan_kind is PlanKind.CHAMFER: + c = p.chamfer + return [(0.0, 0.0), (w, 0.0), (w, d - c), (w - c, d), (0.0, d)] + nw, nd = p.notch_w, p.notch_d + return [(0.0, 0.0), (w, 0.0), (w, d - nd), (w - nw, d - nd), (w - nw, d), (0.0, d)] + + +def _sub(a, b): + return (a[0] - b[0], a[1] - b[1]) + + +def _add(a, b): + return (a[0] + b[0], a[1] + b[1]) + + +def _mul(a, k): + return (a[0] * k, a[1] * k) + + +def _dot(a, b): + return a[0] * b[0] + a[1] * b[1] + + +def _cross(a, b): + return a[0] * b[1] - a[1] * b[0] + + +def _unit(a): + n = math.hypot(*a) + return (a[0] / n, a[1] / n) + + +def edge_frames(poly: list) -> list[dict]: + """Per edge: start vertex, tangent, outward normal, length.""" + out = [] + for i, v0 in enumerate(poly): + v1 = poly[(i + 1) % len(poly)] + t = _unit(_sub(v1, v0)) + out.append({"v0": v0, "v1": v1, "t": t, "n": (t[1], -t[0]), "length": math.hypot(*_sub(v1, v0))}) + return out + + +def signed_area(poly: list) -> float: + return 0.5 * sum(_cross(poly[i], poly[(i + 1) % len(poly)]) for i in range(len(poly))) + + +def _segments_cross(a0, a1, b0, b1) -> bool: + d1, d2 = _cross(_sub(a1, a0), _sub(b0, a0)), _cross(_sub(a1, a0), _sub(b1, a0)) + d3, d4 = _cross(_sub(b1, b0), _sub(a0, b0)), _cross(_sub(b1, b0), _sub(a1, b0)) + return d1 * d2 < 0.0 and d3 * d4 < 0.0 + + +def is_simple(poly: list) -> bool: + n = len(poly) + for i in range(n): + for j in range(i + 2, n): + if i == 0 and j == n - 1: + continue + if _segments_cross(poly[i], poly[(i + 1) % n], poly[j], poly[(j + 1) % n]): + return False + return True + + +def offset_polygon(poly: list, d: float) -> list: + """Move every edge inward by d (edge lines shift along -n); vertex = intersection of adjacent offset lines.""" + frames = edge_frames(poly) + out = [] + for i in range(len(poly)): + n_in, n_out = frames[i - 1]["n"], frames[i]["n"] + k = 1.0 + _dot(n_in, n_out) + if k < 1.0e-6: + raise LayoutError("edge reversal: adjacent edges are anti-parallel") + out.append(_sub(poly[i], _mul(_add(n_in, n_out), d / k))) + return out + + +def tier_plans(p: FacadeParams) -> list[list]: + base = base_plan(p) + n_tiers = (p.n_floors + p.setback_every - 1) // p.setback_every + plans = [] + for k in range(n_tiers): + poly = offset_polygon(base, k * p.setback_depth) if k else base + before, after = edge_frames(base), edge_frames(poly) + for b, a in zip(before, after): + if _dot(b["t"], a["t"]) < 0.999999 or a["length"] <= 0.0: + raise LayoutError(f"tier {k}: setback collapses an edge") + if signed_area(poly) <= 0.0 or not is_simple(poly): + raise LayoutError(f"tier {k}: setback polygon is not simple / CCW") + plans.append(poly) + return plans + + +# ---------------------------------------------------------------- corners + + +def corner_turn(frames: list, i: int) -> float: + """Signed turn at vertex i (incoming edge i-1 -> outgoing edge i), degrees; + = convex (left turn).""" + t_in, t_out = frames[i - 1]["t"], frames[i]["t"] + return math.degrees(math.atan2(_cross(t_in, t_out), _dot(t_in, t_out))) + + +def corner_profile_local(turn_deg: float, p: FacadeParams, joint: float | None = None) -> list[tuple[float, float]]: + """Corner piece plan polygon in the corner frame (x = incoming tangent, second coord = incoming normal). + + Bounded by the building line (two reserves of corner_c - joint/2 each side of the vertex), the two panel-band + outer faces (offset frame_d) and the band end lines. Returned CCW in (x, n) coordinates.""" + j = p.joint if joint is None else joint + c, fd = p.corner_c - j / 2.0, p.frame_d + a = math.radians(turn_deg) + # Plan coords with the incoming edge along +x; a CCW plan puts the outward normal at -y. + t_in, n_in = (1.0, 0.0), (0.0, -1.0) + t_out = (math.cos(a), math.sin(a)) + n_out = (t_out[1], -t_out[0]) + k = 1.0 + _dot(n_in, n_out) + if k < 1.0e-6: + raise LayoutError("corner too sharp") + v = (0.0, 0.0) + a0 = _mul(t_in, -c) + a1 = _add(a0, _mul(n_in, fd)) + apex = _mul(_add(n_in, n_out), fd / k) + b1 = _add(_mul(t_out, c), _mul(n_out, fd)) + b0 = _mul(t_out, c) + poly = [a0, a1, apex, b1, b0, v] + if signed_area(poly) < 0.0: + poly.reverse() + if not is_simple(poly): + raise LayoutError(f"corner profile not simple at turn {turn_deg:.3f}") + # (x, y) -> (x, outward = -y); the mirror flips orientation, so reverse to stay CCW + local = [(x, -y) for x, y in poly] + return list(reversed(local)) + + +# ---------------------------------------------------------------- field + quantization + + +def fin_bin_angles(k: int) -> list[float]: + return [-FIN_LIMIT + 2.0 * FIN_LIMIT * i / (k - 1) for i in range(k)] + + +def quantize_fin(theta: float, k: int) -> tuple[int, float]: + theta = max(-FIN_LIMIT, min(FIN_LIMIT, theta)) + index = int(round((theta + FIN_LIMIT) / (2.0 * FIN_LIMIT) * (k - 1))) + return index, fin_bin_angles(k)[index] + + +def sun_vector(p: FacadeParams) -> tuple[float, float]: + az = math.radians(p.sun_azimuth) + return (math.sin(az), math.cos(az)) + + +def edge_has_fins(n, p: FacadeParams) -> bool: + return _dot(n, sun_vector(p)) > FIN_FACING_MIN + + +def theta_sun(n, p: FacadeParams) -> float: + s = sun_vector(p) + phi = math.degrees(math.atan2(_cross(n, s), _dot(n, s))) + return max(-SUN_THETA_LIMIT, min(SUN_THETA_LIMIT, phi)) + + +def orientation(n) -> str: + """N/E/S/W by outward normal; ties (45° edges) go to N/S (|ny| >= |nx|).""" + if abs(n[1]) >= abs(n[0]): + return "N" if n[1] > 0.0 else "S" + return "E" if n[0] > 0.0 else "W" + + +# ---------------------------------------------------------------- subdivision + + +def subdivide_edge(length: float, p: FacadeParams) -> dict: + """[corner c][closer][n x w_std][closer][corner c]; closers symmetric and in [closer_min, closer_min + w_std/2).""" + eff = length - 2.0 * p.corner_c + if eff < 2.0 * p.closer_min - 1.0e-9: + raise LayoutError(f"edge {length:.3f} too short for two corners and two closers") + n = int(math.floor((eff - 2.0 * p.closer_min) / p.w_std + 1.0e-9)) + closer = (eff - n * p.w_std) / 2.0 + widths = [closer] + [p.w_std] * n + [closer] + starts, s = [], p.corner_c + for w in widths: + starts.append(s) + s += w + return {"n_std": n, "closer": closer, "widths": widths, "starts": starts} + + +def _r(value: float) -> float: + return round(value, TYPE_ROUND_DIGITS) + + +def _mm(value: float) -> str: + text = f"{_r(value):.3f}".rstrip("0").rstrip(".") + return text.replace("-", "m") + + +def solid_type_id(w: float, h: float) -> str: + return f"solid-w{_mm(w)}-h{_mm(h)}" + + +def vision_type_id(w: float, h: float, spandrel: float) -> str: + return f"vision-w{_mm(w)}-h{_mm(h)}-s{_mm(spandrel)}" + + +def fin_type_id(angle: float, h: float) -> str: + return f"fin-a{_mm(angle)}-h{_mm(h)}" + + +def fin_root_s(s0: float, w: float, p: FacadeParams) -> float: + """Fin root along the edge: centreline of the panel's right jamb (A6).""" + return s0 + w - p.joint / 2.0 - p.frame_sight / 2.0 + + +def corner_type_id(turn: float, h: float) -> str: + return f"corner-t{_mm(turn)}-h{_mm(h)}" + + +# ---------------------------------------------------------------- schedule + + +@dataclass +class FacadeSchedule: + params: FacadeParams + tiers: list # tier polygons + levels: dict # band / floor -> level z + types: dict = field(default_factory=dict) # type_id -> spec + bands: list = field(default_factory=list) # band records (floor bands, lobby, parapets) + floor_types: dict = field(default_factory=dict) # floor_type_id -> {"tier", "phase", "band"} + floors: list = field(default_factory=list) # [{"floor", "tier", "level", "floor_type"}] + stats: dict = field(default_factory=dict) + vision_fraction: dict = field(default_factory=dict) # orientation -> share of standard modules that are vision + + def to_dict(self) -> dict: + return {"params": self.params.to_dict(), "tiers": self.tiers, "levels": self.levels, "types": self.types, + "bands": self.bands, "floor_types": self.floor_types, "floors": self.floors, "stats": self.stats, + "vision_fraction": self.vision_fraction} + + def to_json(self) -> str: + return json.dumps(self.to_dict(), indent=1, ensure_ascii=False) + + def band(self, band_id: str) -> dict: + return next(b for b in self.bands if b["band_id"] == band_id) + + +def _register(types: dict, type_id: str, spec: dict) -> str: + known = types.setdefault(type_id, spec) + if known != spec: + raise LayoutError(f"type id collision: {type_id}") + return type_id + + +def _glass_area(w: float, h: float, spandrel: float, p: FacadeParams) -> float: + """Design vision opening of a vision panel (module w x h). + + Horizontally inside the jambs; vertically from the transom (centred on the spandrel line) or, with no + spandrel, the sill frame, up to the head frame.""" + gw = w - p.joint - 2.0 * p.frame_sight + top = h - p.joint / 2.0 - p.frame_sight + bottom = spandrel + p.frame_sight / 2.0 if spandrel > 0.0 else p.joint / 2.0 + p.frame_sight + return gw * (top - bottom) + + +def _band_panels(tier_poly, band: Band, height: float, p: FacadeParams, types: dict, phase: int | None, + vision_cells: set | None) -> tuple[list, list, list]: + """Panels, corners and fins of one horizontal band on one tier polygon (level-independent: local to the band).""" + frames = edge_frames(tier_poly) + panels, corners, fins_out = [], [], [] + u0 = 0.0 + for e, fr in enumerate(frames): + sub = subdivide_edge(fr["length"], p) + fins, facing = edge_has_fins(fr["n"], p), orientation(fr["n"]) + for k, (s0, w) in enumerate(zip(sub["starts"], sub["widths"])): + is_closer = k in (0, len(sub["widths"]) - 1) + record = {"edge": e, "slot": k, "s0": s0, "w": w, "orientation": facing} + if band is Band.PARAPET or is_closer: + record.update(kind="solid", type_id=_register( + types, solid_type_id(w, height), {"family": "solid", "w": _r(w), "h": _r(height)})) + elif band is Band.LOBBY: + record.update(kind="vision", type_id=_register(types, vision_type_id(w, height, 0.0), { + "family": "vision", "w": _r(w), "h": _r(height), "spandrel": 0.0})) + else: + if (e, k) in vision_cells: + fin = None + if fins: + u = u0 + s0 + w / 2.0 + raw = theta_sun(fr["n"], p) + p.fin_amp * math.sin( + 2.0 * math.pi * (u / p.fin_wavelength + phase / p.fin_period_floors)) + _, fin = quantize_fin(raw, p.fin_bins) + record["fin_raw"] = raw + fins_out.append({"edge": e, "slot": k, "s": fin_root_s(s0, w, p), "angle": fin, + "type_id": _register(types, fin_type_id(fin, height), + {"family": "fin", "angle": _r(fin), "h": _r(height)})}) + record.update(kind="vision", fin=fin, type_id=_register( + types, vision_type_id(w, height, p.spandrel_h), + {"family": "vision", "w": _r(w), "h": _r(height), "spandrel": _r(p.spandrel_h)})) + else: + record.update(kind="solid", type_id=_register( + types, solid_type_id(w, height), {"family": "solid", "w": _r(w), "h": _r(height)})) + panels.append(record) + u0 += fr["length"] + for i in range(len(frames)): + turn = corner_turn(frames, i) + corners.append({"vertex": i, "turn": turn, "type_id": _register( + types, corner_type_id(turn, height), {"family": "corner", "turn": _r(turn), "h": _r(height)})}) + return panels, corners, fins_out + + +def _vision_cells(tier_poly, p: FacadeParams, fractions: dict) -> dict: + """phase -> {(edge, slot)} of standard modules that are vision on this tier. + + Ordered dithering by rank: every (phase, standard module) cell of one orientation is ranked by its 4x4 Bayer + threshold (column = running module index along that orientation, continuous across edges; row = phase), then + exactly round(fraction x cells) lowest-ranked cells become vision. Rank selection hits the count to one cell + (plain thresholding would quantize the fraction to 1/16) while keeping the Bayer spread.""" + cells: dict = {} + column: dict = {} + for e, fr in enumerate(edge_frames(tier_poly)): + o = orientation(fr["n"]) + for k in range(1, subdivide_edge(fr["length"], p)["n_std"] + 1): + bay = column[o] = column.get(o, -1) + 1 + for phase in range(p.fin_period_floors): + rank = (BAYER4[phase % 4][bay % 4], phase // 4, bay // 4) + cells.setdefault(o, []).append((rank, phase, e, k)) + chosen: dict = {phase: set() for phase in range(p.fin_period_floors)} + for o, items in cells.items(): + items.sort() + for _, phase, e, k in items[:int(round(fractions[o] * len(items)))]: + chosen[phase].add((e, k)) + return chosen + + +def _vision_fractions(tiers: list, floors_per_tier: list, p: FacadeParams) -> dict: + """Per orientation: fraction of standard modules that are vision. + + Pooled over the whole tower (every edge of that orientation on every floor): short chamfer / notch / upper-tier + edges carry proportionally more solid closer area, so a per-edge or per-tier target is often unreachable while + the orientation total (what V4 measures) is not.""" + targets = dict(p.wwr_target) + g = _glass_area(p.w_std, p.floor_h, p.spandrel_h, p) + gross, n_std = {}, {} + for poly, reps in zip(tiers, floors_per_tier): + for fr in edge_frames(poly): + o = orientation(fr["n"]) + gross[o] = gross.get(o, 0.0) + reps * (fr["length"] - 2.0 * p.corner_c) * p.floor_h + n_std[o] = n_std.get(o, 0) + reps * subdivide_edge(fr["length"], p)["n_std"] + fraction = {} + for o in gross: + fraction[o] = targets[o] * gross[o] / g / n_std[o] if n_std[o] else 0.0 + if fraction[o] > 1.0: + raise LayoutError(f"WWR target {o}={targets[o]} unreachable: needs {fraction[o]:.3f} of modules as vision") + return fraction + + +def build_schedule(p: FacadeParams | None = None) -> FacadeSchedule: + p = p or default_params() + assert_params(p) + tiers = tier_plans(p) + types: dict = {} + levels = {"lobby": 0.0} + for f in range(1, p.n_floors + 1): + levels[f"floor{f}"] = p.lobby_h + (f - 1) * p.floor_h + sched = FacadeSchedule(params=p, tiers=[list(map(list, t)) for t in tiers], levels=levels) + + rows = math.ceil(p.lobby_h / MAX_PANEL_H - 1.0e-9) + panels, corners, fins = _band_panels(tiers[0], Band.LOBBY, p.lobby_h / rows, p, types, None, None) + sched.bands.append({"band_id": "lobby", "band": Band.LOBBY.value, "tier": 0, "height": p.lobby_h / rows, + "rows": rows, "level": 0.0, "panels": panels, "corners": corners, "fins": fins}) + floors_per_tier = [sum(1 for f in range(1, p.n_floors + 1) if (f - 1) // p.setback_every == k) + for k in range(len(tiers))] + fractions = _vision_fractions(tiers, floors_per_tier, p) + for k, poly in enumerate(tiers): + vision = _vision_cells(poly, p, fractions) + for phase in range(p.fin_period_floors): + floors = [f for f in range(1, p.n_floors + 1) + if (f - 1) // p.setback_every == k and (f - 1) % p.fin_period_floors == phase] + if not floors: + continue + band_id = f"tier{k}-phase{phase}" + panels, corners, fins = _band_panels(poly, Band.TOWER, p.floor_h, p, types, phase, vision[phase]) + sched.bands.append({"band_id": band_id, "band": Band.TOWER.value, "tier": k, "phase": phase, + "height": p.floor_h, "rows": 1, "panels": panels, "corners": corners, "fins": fins}) + sched.floor_types[band_id] = {"tier": k, "phase": phase, "floors": floors} + panels, corners, fins = _band_panels(poly, Band.PARAPET, p.parapet_h, p, types, None, None) + top = max(f for f in range(1, p.n_floors + 1) if (f - 1) // p.setback_every == k) + levels[f"roof{k}"] = p.lobby_h + top * p.floor_h + sched.bands.append({"band_id": f"parapet{k}", "band": Band.PARAPET.value, "tier": k, "height": p.parapet_h, + "rows": 1, "panels": panels, "corners": corners, "fins": fins, "level": levels[f"roof{k}"]}) + for f in range(1, p.n_floors + 1): + k, phase = (f - 1) // p.setback_every, (f - 1) % p.fin_period_floors + sched.floors.append({"floor": f, "tier": k, "level": levels[f"floor{f}"], "floor_type": f"tier{k}-phase{phase}"}) + sched.vision_fraction = fractions + sched.types = types + sched.stats = schedule_stats(sched) + return sched + + +# ---------------------------------------------------------------- design-side statistics (S1 evidence) + + +def band_instances(sched: FacadeSchedule, band_id: str) -> int: + """How many times a band is realized (floor bands repeat per floor; lobby per stacked row; parapet once).""" + b = sched.band(band_id) + return len(sched.floor_types[band_id]["floors"]) if b["band"] == Band.TOWER.value else b["rows"] + + +def design_wwr(sched: FacadeSchedule) -> dict: + """Glass / gross area per orientation over the tower floor bands (design values; S5 re-measures on geometry).""" + p = sched.params + glass, gross = {}, {} + for b in sched.bands: + if b["band"] != Band.TOWER.value: + continue + reps = band_instances(sched, b["band_id"]) + frames = edge_frames(sched.tiers[b["tier"]]) + for e, fr in enumerate(frames): + o = orientation(fr["n"]) + gross[o] = gross.get(o, 0.0) + reps * (fr["length"] - 2.0 * p.corner_c) * p.floor_h + for rec in b["panels"]: + if rec["kind"] == "vision": + glass[rec["orientation"]] = glass.get(rec["orientation"], 0.0) + reps * _glass_area( + rec["w"], p.floor_h, p.spandrel_h, p) + return {o: glass.get(o, 0.0) / gross[o] for o in sorted(gross)} + + +def schedule_stats(sched: FacadeSchedule) -> dict: + counts: dict = {} + for b in sched.bands: + reps = band_instances(sched, b["band_id"]) + for rec in b["panels"] + b["corners"] + b["fins"]: + counts[rec["type_id"]] = counts.get(rec["type_id"], 0) + reps + fam = {} + for tid, spec in sched.types.items(): + fam[spec["family"]] = fam.get(spec["family"], 0) + 1 + p = sched.params + std_types = sorted(t for t, s in sched.types.items() + if s["family"] in ("vision", "solid") and s["w"] == _r(p.w_std) and s["h"] == _r(p.floor_h)) + fin_types = sorted(t for t, s in sched.types.items() if s["family"] == "fin") + fin_err = [abs(max(-FIN_LIMIT, min(FIN_LIMIT, rec["fin_raw"])) - rec["fin"]) + for b in sched.bands for rec in b["panels"] if "fin_raw" in rec] + return { + "n_types": len(sched.types), + "types_by_family": fam, + "standard_panel_types": std_types, + "fin_types": fin_types, + "n_instances": sum(counts.values()), + "instances_by_type": dict(sorted(counts.items())), + "n_floor_types": len(sched.floor_types), + "n_floors": sched.params.n_floors, + "n_tiers": len(sched.tiers), + "design_wwr": design_wwr(sched), + "max_fin_quant_error": max(fin_err) if fin_err else 0.0, + "height": sched.levels[f"roof{len(sched.tiers) - 1}"] + sched.params.parapet_h, + } + + +if __name__ == "__main__": + s = build_schedule() + print(json.dumps({k: v for k, v in s.stats.items() if k != "instances_by_type"}, indent=1)) + + +# ---------------------------------------------------------------- world frames (placement data; y_axis is always +Z) + + +def _frame(origin2, level: float, t) -> dict: + return {"origin": (origin2[0], origin2[1], level), "x_axis": (t[0], t[1], 0.0), "y_axis": (0.0, 0.0, 1.0)} + + +def band_levels(sched: FacadeSchedule, band_id: str) -> list[float]: + """Base level of every realization of a band (per floor; per lobby row; the parapet's roof).""" + b = sched.band(band_id) + if b["band"] == Band.TOWER.value: + return [sched.levels[f"floor{f}"] for f in sched.floor_types[band_id]["floors"]] + if b["band"] == Band.LOBBY.value: + return [row * b["height"] for row in range(b["rows"])] + return [b["level"]] + + +def panel_frame(sched: FacadeSchedule, band: dict, rec: dict, level: float) -> dict: + fr = edge_frames(sched.tiers[band["tier"]])[rec["edge"]] + return _frame(_add(fr["v0"], _mul(fr["t"], rec["s0"])), level, fr["t"]) + + +def fin_frame(sched: FacadeSchedule, band: dict, rec: dict, level: float) -> dict: + fr = edge_frames(sched.tiers[band["tier"]])[rec["edge"]] + root = _add(_add(fr["v0"], _mul(fr["t"], rec["s"])), _mul(fr["n"], sched.params.frame_d)) + return _frame(root, level, fr["t"]) + + +def corner_frame(sched: FacadeSchedule, band: dict, rec: dict, level: float) -> dict: + """x = incoming edge tangent, origin = the building-line vertex.""" + poly = sched.tiers[band["tier"]] + frames = edge_frames(poly) + return _frame(tuple(poly[rec["vertex"]]), level, frames[rec["vertex"] - 1]["t"]) + + +# ---------------------------------------------------------------- slabs + canopy (data) + + +def slab_plans(sched: FacadeSchedule) -> list: + """Per tier: the building line pulled in by slab_gap (floor slabs and that tier's roof share it).""" + return [offset_polygon([tuple(v) for v in poly], sched.params.slab_gap) for poly in sched.tiers] + + +def slab_instances(sched: FacadeSchedule) -> list[dict]: + """Slab occupies [level, level + slab_t]: floor slabs from their floor level (behind the spandrel), roof slabs + below the roof level (top = the roof / terrace surface, behind the top floor's head). A tier's first floor stands + on the tier below's roof, so it gets no slab of its own; its panels start j/2 above that roof, which a floor-style + slab at the roof level would cut through outside the upper building line.""" + p = sched.params + out = [{"tier": 0, "level": 0.0, "role": "ground"}] + for rec in sched.floors: + if rec["tier"] > 0 and (rec["floor"] - 1) % p.setback_every == 0: + continue + out.append({"tier": rec["tier"], "level": rec["level"], "role": f"floor{rec['floor']}"}) + for k in range(len(sched.tiers)): + out.append({"tier": k, "level": sched.levels[f"roof{k}"] - p.slab_t, "role": f"roof{k}"}) + return out + + +def canopy_box(sched: FacadeSchedule) -> dict: + """South entrance canopy over the lobby's central modules on edge 0, snapped to module joints. + Plan x in [x0, x1] along edge 0, y in [-(frame_d + joint + depth), -(frame_d + joint)], z = [z0, z0 + canopy_t] + with z0 on the lobby row joint.""" + p = sched.params + lobby = sched.band("lobby") + fr = edge_frames(sched.tiers[0])[0] + if abs(fr["t"][0] - 1.0) > 1.0e-12 or fr["n"][1] > -1.0 + 1.0e-12: + raise LayoutError("edge 0 is not the south edge") + inner = sorted((r for r in lobby["panels"] if r["edge"] == 0), key=lambda r: r["slot"])[1:-1] + m = p.canopy_modules if (len(inner) - p.canopy_modules) % 2 == 0 else p.canopy_modules - 1 + if m < 1 or m > len(inner): + raise LayoutError(f"canopy spans {m} of {len(inner)} south modules") + first = (len(inner) - m) // 2 + x0 = fr["v0"][0] + inner[first]["s0"] + x1 = fr["v0"][0] + inner[first + m - 1]["s0"] + inner[first + m - 1]["w"] + y1 = fr["v0"][1] - (p.frame_d + p.joint) + z0 = lobby["height"] if lobby["rows"] > 1 else lobby["height"] - p.canopy_t + return {"x0": x0, "x1": x1, "y0": y1 - p.canopy_depth, "y1": y1, "z0": z0, "z1": z0 + p.canopy_t, "modules": m} diff --git a/examples/pcg_facade_tower/panels.py b/examples/pcg_facade_tower/panels.py new file mode 100644 index 00000000..24d80d4a --- /dev/null +++ b/examples/pcg_facade_tower/panels.py @@ -0,0 +1,209 @@ +"""pcg_facade_tower panel family: one Part per panel type id from the layout schedule. + +Panel-local frame (BUILD_PLAN): x along the building edge (0 = left joint centreline), y up (0 = floor level), +z outward (0 = building line). The module is [0, w] x [0, h]; the unit body sits inside the joint, +[j/2, w - j/2] x [j/2, h - j/2] x [0, frame_d]. + +Fin-local frame: same axes as the panel; origin = right-jamb centreline on the frame outer face. +Fins are separate site-attached Parts (see layout.py header): theta > 0 tilts the tip toward +x. + +Families + vision frame ring (vision opening + spandrel opening when spandrel > 0) + recessed glass + spandrel infill + solid frame ring (one opening) + opaque infill (closers, parapets, the Bayer-solid modules) + fin parallelogram blade: root flush on the frame face, sides at theta, thickness fin_t, length fin_depth +""" +from __future__ import annotations + +import math +from pathlib import Path + +import simplecadapi as scad +from simplecadapi import ql + +import layout as L + +ROOT = Path(__file__).resolve().parent +GLASS_TAG = "facade.vision_glass" +PLANE_TOL = 1.0e-3 + + +# ---------------------------------------------------------------- sketch helpers + + +def _rect_loop(sk, key: str, x0: float, y0: float, x1: float, y1: float): + """Closed, fully constrained rectangle loop; profile id = f"{key}_lb" (its first line).""" + for pid, x, y in (("a", x0, y0), ("b", x1, y0), ("c", x1, y1), ("d", x0, y1)): + sk = scad.add_point_rsketch(sketch=sk, point_id=f"{key}_{pid}", x=x, y=y) + for lid, s, e in (("lb", "a", "b"), ("lr", "b", "c"), ("lt", "c", "d"), ("ll", "d", "a")): + sk = scad.add_line_rsketch(sketch=sk, entity_id=f"{key}_{lid}", start=f"{key}_{s}", end=f"{key}_{e}") + sk = scad.constrain_fix_rsketch(sketch=sk, target=f"{key}_a") + sk = scad.constrain_horizontal_rsketch(sketch=sk, line=f"{key}_lb") + sk = scad.constrain_vertical_rsketch(sketch=sk, line=f"{key}_lr") + sk = scad.constrain_horizontal_rsketch(sketch=sk, line=f"{key}_lt") + sk = scad.constrain_vertical_rsketch(sketch=sk, line=f"{key}_ll") + sk = scad.constrain_distance_x_rsketch(sketch=sk, a=f"{key}_a", b=f"{key}_b", value=x1 - x0) + sk = scad.constrain_distance_y_rsketch(sketch=sk, a=f"{key}_a", b=f"{key}_d", value=y1 - y0) + return sk + + +def polygon_loop(sk, key: str, pts): + """Closed polygon loop, fully constrained: first vertex fixed, the rest dimensioned x / y from it. + Profile id = f"{key}_l0".""" + n = len(pts) + for i, (x, y) in enumerate(pts): + sk = scad.add_point_rsketch(sketch=sk, point_id=f"{key}_p{i}", x=x, y=y) + for i in range(n): + sk = scad.add_line_rsketch(sketch=sk, entity_id=f"{key}_l{i}", start=f"{key}_p{i}", end=f"{key}_p{(i + 1) % n}") + sk = scad.constrain_fix_rsketch(sketch=sk, target=f"{key}_p0") + for i in range(1, n): + sk = scad.constrain_distance_x_rsketch(sketch=sk, a=f"{key}_p0", b=f"{key}_p{i}", value=pts[i][0] - pts[0][0]) + sk = scad.constrain_distance_y_rsketch(sketch=sk, a=f"{key}_p0", b=f"{key}_p{i}", value=pts[i][1] - pts[0][1]) + return sk + + +def _rect_plate(name: str, x0: float, y0: float, x1: float, y1: float, z0: float, z1: float): + """profile=sketch: one constrained rectangle extruded from z0 to z1.""" + sk = _rect_loop(scad.make_sketch_rsketch(name=name, plane="XY"), "o", x0, y0, x1, y1) + face = scad.make_face_from_sketch_rface(sketch=sk, profile="o_lb", require_fully_constrained=True) + plate = scad.extrude_rsolid(profile=face, direction=(0.0, 0.0, 1.0), distance=z1 - z0) + return scad.translate_shape(shape=plate, vector=(0.0, 0.0, z0)) + + +# ---------------------------------------------------------------- design openings (shared with the verifier) + + +def openings(w: float, h: float, spandrel: float, frame_sight: float, joint: float) -> dict: + """Clear openings in panel-local (x0, y0, x1, y1). 'vision' only when the panel carries glass.""" + j, s = joint, frame_sight + x0, x1 = j / 2.0 + s, w - j / 2.0 - s + top = h - j / 2.0 - s + out = {} + if spandrel > 0.0: + out["vision"] = (x0, spandrel + s / 2.0, x1, top) + out["spandrel"] = (x0, j / 2.0 + s, x1, spandrel - s / 2.0) + else: + out["vision"] = (x0, j / 2.0 + s, x1, top) + return out + + +def _grow(r, d: float): + return (r[0] - d, r[1] - d, r[2] + d, r[3] + d) + + +def _frame_ring(w, h, holes: dict, frame_d, joint): + j = joint + sk = _rect_loop(scad.make_sketch_rsketch(name="frame-ring", plane="XY"), "o", j / 2.0, j / 2.0, w - j / 2.0, + h - j / 2.0) + for key, r in holes.items(): + sk = _rect_loop(sk, key, *r) + face = scad.make_face_from_sketch_rface(sketch=sk, profile="o_lb", inner_profiles=tuple(f"{k}_lb" for k in holes), + require_fully_constrained=True) + return scad.extrude_rsolid(profile=face, direction=(0.0, 0.0, 1.0), distance=frame_d) + + +def _tag_front_face(body, rect, z: float, tag: str): + """Resolve the +Z planar face at z whose centre lies inside rect, then tag it (exactly one).""" + x0, y0, x1, y1 = rect + faces = ql.faces().where(ql.and_( + ql.prop("geom.normal.z", ">=", 1.0 - 1.0e-6), + ql.prop("geom.center.z", ">=", z - PLANE_TOL), ql.prop("geom.center.z", "<=", z + PLANE_TOL), + ql.prop("geom.center.x", ">=", x0), ql.prop("geom.center.x", "<=", x1), + ql.prop("geom.center.y", ">=", y0), ql.prop("geom.center.y", "<=", y1), + )).resolve(body) + if len(faces) != 1: + raise ValueError(f"{tag}: expected one glass face at z={z}, found {len(faces)}") + return scad.apply_tag_rselection(scope=body, targets=list(faces), tag=tag) + + +# ---------------------------------------------------------------- builders (every dimension is a builder argument) + + +def build_vision(*, w: float, h: float, spandrel: float, frame_d: float, frame_sight: float, joint: float, + glass_t: float, glass_recess: float): + s = frame_sight + ops = openings(w, h, spandrel, frame_sight, joint) + glass_z1 = frame_d - glass_recess + glass_z0 = glass_z1 - glass_t + + # ---- feature: frame-ring (build, profile=sketch) ---- + body = _frame_ring(w, h, ops, frame_d, joint) + + # ---- feature: spandrel-infill (add, profile=sketch) ---- + # opaque infill sits half a recess proud of the glass so it reads as a separate plane + if "spandrel" in ops: + body = scad.union_rsolid(body, _rect_plate("spandrel-infill", *_grow(ops["spandrel"], s / 2.0), glass_z0, + frame_d - glass_recess / 2.0)) + + # ---- feature: vision-glass (add, profile=sketch) ---- + # grown by s/2 into the jambs so the plate bonds to the ring; its exposed front = the clear opening + body = scad.union_rsolid(body, _rect_plate("vision-glass", *_grow(ops["vision"], s / 2.0), glass_z0, glass_z1)) + + # ---- feature: vision-glass-name (annotate) ---- + return _tag_front_face(body, ops["vision"], glass_z1, GLASS_TAG) + + +def build_solid(*, w: float, h: float, frame_d: float, frame_sight: float, joint: float, glass_t: float, + glass_recess: float): + s = frame_sight + opening = openings(w, h, 0.0, frame_sight, joint)["vision"] + + # ---- feature: frame-ring (build, profile=sketch) ---- + body = _frame_ring(w, h, {"op": opening}, frame_d, joint) + + # ---- feature: opaque-infill (add, profile=sketch) ---- + return scad.union_rsolid(body, _rect_plate("opaque-infill", *_grow(opening, s / 2.0), + frame_d - glass_recess - glass_t, frame_d - glass_recess / 2.0)) + + +def fin_section(angle: float, fin_t: float, fin_depth: float) -> list[tuple[float, float]]: + """Parallelogram in fin-local (x, z): root on z = 0 centred on x = 0, sides along (sin a, cos a).""" + th = math.radians(angle) + half = fin_t / (2.0 * math.cos(th)) + dx, dz = fin_depth * math.sin(th), fin_depth * math.cos(th) + return [(-half, 0.0), (half, 0.0), (half + dx, dz), (-half + dx, dz)] + + +def build_fin(*, angle: float, h: float, joint: float, fin_t: float, fin_depth: float): + (r0x, _), (r1x, _), (t1x, t1z), (t0x, _) = fin_section(angle, fin_t, fin_depth) + + # ---- feature: fin-blade (build, profile=sketch) ---- + # XZ sketch: (u, v) -> world (x, z); explicit x / z offsets keep the sign of the angle unambiguous + sk = scad.make_sketch_rsketch(name="fin-blade", plane="XZ") + for pid, x, z in (("r0", r0x, 0.0), ("r1", r1x, 0.0), ("t1", t1x, t1z), ("t0", t0x, t1z)): + sk = scad.add_point_rsketch(sketch=sk, point_id=pid, x=x, y=z) + for lid, a, b in (("root", "r0", "r1"), ("side_r", "r1", "t1"), ("tip", "t1", "t0"), ("side_l", "t0", "r0")): + sk = scad.add_line_rsketch(sketch=sk, entity_id=lid, start=a, end=b) + sk = scad.constrain_fix_rsketch(sketch=sk, target="r0") + sk = scad.constrain_horizontal_rsketch(sketch=sk, line="root") + sk = scad.constrain_horizontal_rsketch(sketch=sk, line="tip") + sk = scad.constrain_distance_x_rsketch(sketch=sk, a="r0", b="r1", value=r1x - r0x) + sk = scad.constrain_distance_x_rsketch(sketch=sk, a="r0", b="t0", value=t0x - r0x) + sk = scad.constrain_distance_y_rsketch(sketch=sk, a="r0", b="t0", value=t1z) + sk = scad.constrain_distance_x_rsketch(sketch=sk, a="t0", b="t1", value=t1x - t0x) + face = scad.make_face_from_sketch_rface(sketch=sk, profile="root", require_fully_constrained=True) + blade = scad.extrude_rsolid(profile=face, direction=(0.0, 1.0, 0.0), distance=h - joint) + return scad.translate_shape(shape=blade, vector=(0.0, joint / 2.0, 0.0)) + + +# ---------------------------------------------------------------- type table -> Part + + +def builder_args(spec: dict, p: L.FacadeParams) -> tuple: + """(builder, kwargs) for one type spec. Every value that shapes the solid is an argument (build_key).""" + common = dict(frame_d=p.frame_d, frame_sight=p.frame_sight, joint=p.joint, glass_t=p.glass_t, + glass_recess=p.glass_recess) + fam = spec["family"] + if fam == "vision": + return build_vision, dict(w=spec["w"], h=spec["h"], spandrel=spec["spandrel"], **common) + if fam == "solid": + return build_solid, dict(w=spec["w"], h=spec["h"], **common) + if fam == "fin": + return build_fin, dict(angle=spec["angle"], h=spec["h"], joint=p.joint, fin_t=p.fin_t, + fin_depth=p.fin_depth) + raise ValueError(f"not a panel family: {fam}") + + +def make_panel_part(type_id: str, spec: dict, p: L.FacadeParams): + """Part factory: part id == type id, so equal parameters hit the cache under the same identity.""" + builder, kwargs = builder_args(spec, p) + return scad.part(id=type_id, revision="1.0.0", project_root=ROOT)(builder)(**kwargs) diff --git a/examples/pcg_facade_tower/slabs.py b/examples/pcg_facade_tower/slabs.py new file mode 100644 index 00000000..6d04488b --- /dev/null +++ b/examples/pcg_facade_tower/slabs.py @@ -0,0 +1,54 @@ +"""pcg_facade_tower slabs and the entrance canopy. + +Slab-local frame = world axes, z = 0 at the slab's level: each tier's building line pulled in by slab_gap, +extruded slab_t up (A3: the slab occupies [level, level + slab_t]; floor slabs from the floor level, roof slabs +ending at the roof; `layout.slab_instances`). +Floor slabs and the tier's roof share one Part per tier; placement only translates by the level. +Canopy-local frame = world (it is built where it stands; placed with the identity). +""" +from __future__ import annotations + +import simplecadapi as scad + +import layout as L +import panels as P + + +def slab_type_id(tier: int) -> str: + return f"slab-tier{tier}" + + +CANOPY_ID = "canopy-south" + + +def build_slab(*, plan: tuple, slab_t: float): + # ---- feature: slab-plate (build, profile=sketch) ---- + sk = P.polygon_loop(scad.make_sketch_rsketch(name="slab-plate", plane="XY"), "s", plan) + face = scad.make_face_from_sketch_rface(sketch=sk, profile="s_l0", require_fully_constrained=True) + return scad.extrude_rsolid(profile=face, direction=(0.0, 0.0, 1.0), distance=slab_t) + + +def build_canopy(*, x0: float, x1: float, y0: float, y1: float, z0: float, z1: float): + # ---- feature: canopy-plate (build, profile=sketch) ---- + sk = P._rect_loop(scad.make_sketch_rsketch(name="canopy-plate", plane="XY"), "o", x0, y0, x1, y1) + face = scad.make_face_from_sketch_rface(sketch=sk, profile="o_lb", require_fully_constrained=True) + plate = scad.extrude_rsolid(profile=face, direction=(0.0, 0.0, 1.0), distance=z1 - z0) + return scad.translate_shape(shape=plate, vector=(0.0, 0.0, z0)) + + +def slab_args(sched: L.FacadeSchedule, tier: int) -> dict: + plan = tuple((round(x, 6), round(y, 6)) for x, y in L.slab_plans(sched)[tier]) + return dict(plan=plan, slab_t=sched.params.slab_t) + + +def canopy_args(sched: L.FacadeSchedule) -> dict: + box = L.canopy_box(sched) + return {k: box[k] for k in ("x0", "x1", "y0", "y1", "z0", "z1")} + + +def make_slab_part(sched: L.FacadeSchedule, tier: int): + return scad.part(id=slab_type_id(tier), revision="1.0.0", project_root=P.ROOT)(build_slab)(**slab_args(sched, tier)) + + +def make_canopy_part(sched: L.FacadeSchedule): + return scad.part(id=CANOPY_ID, revision="1.0.0", project_root=P.ROOT)(build_canopy)(**canopy_args(sched)) diff --git a/examples/pcg_facade_tower/tower.py b/examples/pcg_facade_tower/tower.py new file mode 100644 index 00000000..b2ccc5e4 --- /dev/null +++ b/examples/pcg_facade_tower/tower.py @@ -0,0 +1,76 @@ +"""pcg_facade_tower tower assembly: band subassembly instances by level + slabs + the entrance canopy. + +Tower frame = world. Band subassemblies are band-local (plan axes = world, z = 0 at the band's level), so every +instance is a pure translation to its level: the lobby at 0 (it holds both rows), each floor at its floor level +(floor type tier{k}-phase{j}), each tier's parapet at its roof. Slabs translate by their instance level +(`layout.slab_instances`); the canopy is built where it stands. Everything is grounded (A2). + +Component ids: lobby, floor{f}, parapet{k}, slab-{role}, canopy. + + ../../.venv/bin/python tower.py [rect|chamfer|l_shape] # build + print counts +""" +from __future__ import annotations + +import sys +import time + +import simplecadapi as scad + +import floor as F +import layout as L +import panels as P +import slabs as S + +TOWER_ID = "facade-tower" + + +def tower_components(sched: L.FacadeSchedule) -> list[dict]: + """[{component_id, ref, level}]: ref = ("band", band_id) | ("slab", tier) | ("canopy", None).""" + out = [{"component_id": "lobby", "ref": ("band", "lobby"), "level": 0.0}] + out += [{"component_id": f"floor{r['floor']}", "ref": ("band", r["floor_type"]), "level": r["level"]} + for r in sched.floors] + out += [{"component_id": b["band_id"], "ref": ("band", b["band_id"]), "level": b["level"]} + for b in sched.bands if b["band"] == L.Band.PARAPET.value] + out += [{"component_id": f"slab-{i['role']}", "ref": ("slab", i["tier"]), "level": i["level"]} + for i in L.slab_instances(sched)] + out.append({"component_id": "canopy", "ref": ("canopy", None), "level": 0.0}) + return out + + +def definitions(sched: L.FacadeSchedule, comps: list[dict]) -> dict: + """ref -> build result (band AssemblyBuildResult / slab or canopy PartBuildResult), each built once.""" + out = {} + for ref in dict.fromkeys(c["ref"] for c in comps): + kind, key = ref + out[ref] = (F.make_band_assembly(sched, key) if kind == "band" + else S.make_slab_part(sched, key) if kind == "slab" else S.make_canopy_part(sched)) + return out + + +def make_tower(sched: L.FacadeSchedule) -> scad.AssemblyBuildResult: + comps = tower_components(sched) + defs = definitions(sched, comps) + + @scad.assemble(id=TOWER_ID, revision="1.0.0", definitions=tuple(defs.values()), project_root=P.ROOT) + def build(plan_kind: str, n_floors: int) -> scad.Assembly: + # ---- feature: tower-stack (assemble) ---- + # band instances, slabs and canopy translated to their levels (world axes) and grounded + asm = scad.make_assembly_rassembly(assembly_id=TOWER_ID, name=f"facade tower {plan_kind} {n_floors}F") + for c in comps: + asm = scad.add_component_rassembly( + assembly=asm, item=defs[c["ref"]].value, component_id=c["component_id"], + placement=scad.make_placement_rplacement(origin=(0.0, 0.0, c["level"]), x_axis=(1.0, 0.0, 0.0), + y_axis=(0.0, 1.0, 0.0))) + asm = scad.ground_component_rassembly(assembly=asm, component_id=c["component_id"]) + return asm + + return build(plan_kind=sched.params.plan_kind.value, n_floors=sched.params.n_floors) + + +if __name__ == "__main__": + kind = L.PlanKind(sys.argv[1]) if len(sys.argv) > 1 else L.PlanKind.CHAMFER + start = time.perf_counter() + s = L.build_schedule(L.default_params(plan_kind=kind)) + r = make_tower(s) + print(f"{kind.value}: {len(r.value.components)} tower components, {len(r.definition.definition_refs)} definitions, " + f"{s.stats['n_instances']} facade pieces, {time.perf_counter() - start:.1f}s") diff --git a/examples/pcg_facade_tower/verify/_common.py b/examples/pcg_facade_tower/verify/_common.py new file mode 100644 index 00000000..5bcd9273 --- /dev/null +++ b/examples/pcg_facade_tower/verify/_common.py @@ -0,0 +1,55 @@ +"""Shared verifier helpers (diagnostic only; never used inside the model graph).""" +from __future__ import annotations + +import sys +from pathlib import Path + +PART_DIR = Path(__file__).resolve().parents[1] +if str(PART_DIR) not in sys.path: + sys.path.insert(0, str(PART_DIR)) + +OUT = Path(__file__).resolve().parent / "renders" + + +def tight_bbox(shape) -> tuple: + """Exact bbox (AddOptimal, no gap); accepts a SimpleCAD shape or a raw TopoDS_Shape.""" + from OCP.Bnd import Bnd_Box + from OCP.BRepBndLib import BRepBndLib + + box = Bnd_Box() + box.SetGap(0.0) + BRepBndLib.AddOptimal_s(getattr(shape, "wrapped", shape), box, useTriangulation=False) + return box.Get() + + +def report(title: str, failures: list) -> int: + print(f"== {title}: {'PASS' if not failures else 'FAIL'}") + for failure in failures: + print(f" - {failure}") + return 1 if failures else 0 + + +def place_shape(shape, frame: dict): + """Diagnostic placement (layout frame -> world) for local-frame solids: y_axis must be +Z. + Local x -> x_axis, y -> +Z, z -> x_axis x Z (the outward normal).""" + import math + + import simplecadapi as scad + + ox, oy, oz = frame["origin"] + tx, ty, _ = frame["x_axis"] + assert tuple(frame["y_axis"]) == (0.0, 0.0, 1.0) + upright = scad.rotate_shape(shape=shape, angle=90.0, axis=(1.0, 0.0, 0.0), origin=(0.0, 0.0, 0.0)) + turned = scad.rotate_shape(shape=upright, angle=math.degrees(math.atan2(ty, tx)), axis=(0.0, 0.0, 1.0), + origin=(0.0, 0.0, 0.0)) + return scad.translate_shape(shape=turned, vector=(ox, oy, oz)) + + +def min_distance(a, b) -> float: + from OCP.BRepExtrema import BRepExtrema_DistShapeShape + + dist = BRepExtrema_DistShapeShape(getattr(a, "wrapped", a), getattr(b, "wrapped", b)) + dist.Perform() + if not dist.IsDone(): + raise RuntimeError("distance computation failed") + return dist.Value() diff --git a/examples/pcg_facade_tower/verify/render_stage.py b/examples/pcg_facade_tower/verify/render_stage.py new file mode 100644 index 00000000..076c8209 --- /dev/null +++ b/examples/pcg_facade_tower/verify/render_stage.py @@ -0,0 +1,394 @@ +"""Per-stage render -> verify/renders/_*.png (Z up). + + ../../../.venv/bin/python render_stage.py s1 [rect|chamfer|l_shape ...] # massing four-view + plan + unrolled elevation + ../../../.venv/bin/python render_stage.py s2 # panel types + the K fin row + ../../../.venv/bin/python render_stage.py s3 # corner fits, slab skeletons, canopy + ../../../.venv/bin/python render_stage.py s4 # band subassemblies (solved placements) + ../../../.venv/bin/python render_stage.py s5 # tower four-view, south, setback + +S2 renders mount panel-local parts as on a south facade (x -> +X, y up -> +Z, outward z -> -Y). +""" +from __future__ import annotations + +import math +import sys +from dataclasses import replace + +import simplecadapi as scad +from _common import OUT, tight_bbox + +import layout as L + +MASSING_VIEWS = [(25, 215, "iso from SW"), (25, 35, "iso from NE"), (0, 180, "south elevation"), + (90, 0, "plan (from +Z)")] + + +def _prism(poly, z0: float, z1: float): + wire = scad.make_polyline_rwire(points=[(x, y, z0) for x, y in poly], closed=True) + face = scad.make_face_from_wire_rface(wire=wire, normal=(0.0, 0.0, 1.0)) + return scad.extrude_rsolid(profile=face, direction=(0.0, 0.0, 1.0), distance=z1 - z0) + + +def massing(sched: L.FacadeSchedule) -> list: + """Tier prisms: building line from the tier below's roof up to this tier's roof (tier 0 includes the lobby).""" + solids, z0 = [], 0.0 + for k, poly in enumerate(sched.tiers): + z1 = sched.levels[f"roof{k}"] + solids.append(_prism(poly, z0, z1)) + z0 = z1 + return solids + + +def plan_figure(sched: L.FacadeSchedule, path) -> str: + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + from matplotlib.patches import Polygon + + p = sched.params + depth = 400.0 # band drawn ~2.7x frame_d so it reads at plan scale (corner reserve must stay > depth) + drawn = replace(p, frame_d=depth) + fig, axes = plt.subplots(1, len(sched.tiers), figsize=(6.2 * len(sched.tiers), 5.6)) + axes = [axes] if len(sched.tiers) == 1 else list(axes) + shades = {"vision": "#d9d9d9", "solid": "#555555"} + for k, ax in enumerate(axes): + band = sched.band(f"tier{k}-phase0") + poly = sched.tiers[k] + frames = L.edge_frames(poly) + ax.add_patch(Polygon(poly, closed=True, fill=False, lw=0.6, ls="--", ec="#888888")) + for r in band["panels"]: + fr = frames[r["edge"]] + a = L._add(fr["v0"], L._mul(fr["t"], r["s0"] + p.joint / 2.0)) + b = L._add(fr["v0"], L._mul(fr["t"], r["s0"] + r["w"] - p.joint / 2.0)) + quad = [a, b, L._add(b, L._mul(fr["n"], depth)), L._add(a, L._mul(fr["n"], depth))] + closer = r["slot"] in (0, max(q["slot"] for q in band["panels"] if q["edge"] == r["edge"])) + ax.add_patch(Polygon(quad, closed=True, lw=0.2, ec="white", + fc="#e8743b" if closer else shades[r["kind"]])) + if r.get("fin") is not None: # fin at the right jamb, rotated about the jamb by the bin angle + th = math.radians(r["fin"]) + root = L._add(b, L._mul(fr["n"], depth)) + tip_dir = L._add(L._mul(fr["n"], math.cos(th)), L._mul(fr["t"], math.sin(th))) + tip = L._add(root, L._mul(tip_dir, 2.0 * depth)) + ax.plot([root[0], tip[0]], [root[1], tip[1]], color="black", lw=0.7) + for c in band["corners"]: + prof = L.corner_profile_local(c["turn"], drawn) + fr = frames[c["vertex"] - 1] + v = tuple(poly[c["vertex"]]) + world = [L._add(L._add(v, L._mul(fr["t"], x)), L._mul(fr["n"], z)) for x, z in prof] + ax.add_patch(Polygon(world, closed=True, fc="black", ec="black", lw=0.3)) + xs = [v[0] for v in sched.tiers[0]] + ys = [v[1] for v in sched.tiers[0]] + ax.set_xlim(min(xs) - 3000, max(xs) + 3000) + ax.set_ylim(min(ys) - 3000, max(ys) + 3000) + ax.set_aspect("equal") + ax.set_title(f"tier {k} (setback {k * p.setback_depth:.0f}) phase 0", fontsize=10) + ax.tick_params(labelsize=7) + fig.suptitle(f"{p.plan_kind.value}: grey = vision, dark = solid, orange = closer, black = corner piece, " + f"line = fin (bin angle); band depth exaggerated", fontsize=10) + fig.tight_layout() + fig.savefig(path, dpi=150) + plt.close(fig) + return str(path) + + +def elevation_figure(sched: L.FacadeSchedule, path) -> str: + """Unrolled perimeter elevation, every floor: the Bayer WWR dither and the quantized fin wave.""" + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + from matplotlib.colors import Normalize + from matplotlib.cm import ScalarMappable + from matplotlib.patches import Rectangle + + p = sched.params + cmap = plt.get_cmap("coolwarm") + norm = Normalize(-L.FIN_LIMIT, L.FIN_LIMIT) + fig, ax = plt.subplots(figsize=(18, 7.5)) + width = 0.0 + for rec in sched.floors: + band = sched.band(rec["floor_type"]) + frames = L.edge_frames(sched.tiers[rec["tier"]]) + starts, u = [], 0.0 + for fr in frames: + starts.append(u) + u += fr["length"] + width = max(width, u) + for r in band["panels"]: + x = starts[r["edge"]] + r["s0"] + if r["kind"] == "solid": + fc = "#444444" + elif r.get("fin") is None: + fc = "#e6e6e6" + else: + fc = cmap(norm(r["fin"])) + ax.add_patch(Rectangle((x, rec["level"]), r["w"], p.floor_h, fc=fc, ec="white", lw=0.15)) + for e, s in enumerate(starts): + ax.add_patch(Rectangle((s - p.corner_c, rec["level"]), 2 * p.corner_c, p.floor_h, fc="black", lw=0)) + ax.set_xlim(-1000, width + 1000) + ax.set_ylim(p.lobby_h - 1000, sched.stats["height"]) + ax.set_xlabel("perimeter u (mm), from SW corner CCW: S -> E -> ... ") + ax.set_ylabel("level z (mm)") + ax.set_title(f"{p.plan_kind.value}: unrolled elevation, {p.n_floors} floors. dark = solid, light = vision no fin, " + f"colour = fin bin angle (K={p.fin_bins}); WWR " + + " ".join(f"{o} {v:.3f}" for o, v in sched.stats["design_wwr"].items()), fontsize=10) + fig.colorbar(ScalarMappable(norm=norm, cmap=cmap), ax=ax, label="fin angle (deg)", fraction=0.02) + fig.tight_layout() + fig.savefig(path, dpi=130) + plt.close(fig) + return str(path) + + +# (elev, azim) are world-fixed (elev toward +Z, azim from +X); panel-local renders use view_up +y +PANEL_VIEWS_LOCAL = [(30, 35, "iso, outside"), (90, 0, "outside (+z)"), (-90, 0, "inside (-z)"), + (0, 0, "side (+x): depth profile")] + + +def _south(shape, dx: float = 0.0): + """Panel-local -> world as mounted on a south edge, shifted dx along the facade.""" + upright = scad.rotate_shape(shape=shape, angle=90.0, axis=(1.0, 0.0, 0.0), origin=(0.0, 0.0, 0.0)) + return scad.translate_shape(shape=upright, vector=(dx, 0.0, 0.0)) + + +def _fin_on_panel(fin_body, w: float, p) -> object: + """Fin-local -> panel-local: root on the right-jamb centreline of the frame outer face (A6).""" + return scad.translate_shape(shape=fin_body, vector=(w - p.joint / 2.0 - p.frame_sight / 2.0, 0.0, p.frame_d)) + + +def render_s2() -> list[str]: + import panels as P + from s2_verify import all_types + + OUT.mkdir(exist_ok=True) + p = L.default_params() + types = all_types() + body = {tid: P.make_panel_part(tid, spec, p).value.body for tid, spec in types.items()} + out = [] + for tid, spec in sorted(types.items()): # one four-view per vision type (glass tag highlighted) + if spec["family"] == "vision": + # panel-local, untransformed: a moved shape keeps its tags only in lineage scope, and the renderer + # highlights effective tags + out.append(scad.render_screenshot_rpath( + shapes=[body[tid]], output_path=str(OUT / f"s2_{tid}.png"), views=PANEL_VIEWS_LOCAL, + view_up=(0.0, 1.0, 0.0), highlight_tags=[P.GLASS_TAG], show_callouts=False, show_legend=False)) + solids = sorted((t for t, s in types.items() if s["family"] == "solid"), key=lambda t: (types[t]["h"], types[t]["w"])) + row, x = [], 0.0 + for tid in solids: # every solid type side by side, 300 apart + row.append(_south(body[tid], x)) + x += types[tid]["w"] + 300.0 + out.append(scad.render_screenshot_rpath(shapes=row, output_path=str(OUT / "s2_solid_types.png"), + views=[(20, 235, "iso, outside"), (0, 270, "outside (south)")], + view_up=(0.0, 0.0, 1.0), show_callouts=False, show_legend=False)) + std = L.vision_type_id(p.w_std, p.floor_h, p.spandrel_h) + fins = sorted((t for t, s in types.items() if s["family"] == "fin"), key=lambda t: types[t]["angle"]) + row = [] + for i, tid in enumerate(fins): # the K bins, each on a standard vision panel, adjacent modules + row.append(_south(body[std], i * p.w_std)) + row.append(_south(_fin_on_panel(body[tid], p.w_std, p), i * p.w_std)) + out.append(scad.render_screenshot_rpath( + shapes=row, output_path=str(OUT / "s2_fin_bins.png"), + views=[(25, 235, "iso, outside"), (0, 270, "outside (south)"), (60, 270, "high, outside"), + (90, 0, "plan from +Z")], + view_up=(0.0, 0.0, 1.0), show_callouts=False, show_legend=False)) + # blade sections alone, fin-local, 500 apart in x, looking down the extrusion (+y -> viewer) + sections = [scad.translate_shape(shape=body[tid], vector=(i * 500.0, 0.0, 0.0)) for i, tid in enumerate(fins)] + out.append(scad.render_screenshot_rpath( + shapes=sections, output_path=str(OUT / "s2_fin_sections.png"), + views=[(0, 90, "from +y (x runs left): " + " ".join(f"{types[t]['angle']:g}" for t in fins)), + (30, 60, "iso")], + view_up=(0.0, 0.0, 1.0), show_callouts=False, show_legend=False)) + return out + + +def _corner_assembly(sched: L.FacadeSchedule, band: dict, rec: dict, n_side: int = 2) -> tuple[list, tuple]: + """World-placed corner + n_side panels each side (s3_verify placement), shifted so the vertex is the origin. + Returns (shapes, outward bisector).""" + from _common import place_shape + from s3_verify import Parts + + parts, level = Parts(sched), L.band_levels(sched, band["band_id"])[0] + poly = [tuple(v) for v in sched.tiers[band["tier"]]] + i, frames = rec["vertex"], L.edge_frames(poly) + e_in = (i - 1) % len(poly) + near = sorted((r for r in band["panels"] if r["edge"] == e_in), key=lambda r: r["slot"])[-n_side:] + near += sorted((r for r in band["panels"] if r["edge"] == i), key=lambda r: r["slot"])[:n_side] + shapes = [parts.corner(band, rec, level)] + [parts.panel(band, r, level) for r in near] + v = poly[i] + moved = [scad.translate_shape(shape=sh, vector=(-v[0], -v[1], -level)) for sh in shapes] + return moved, L._add(frames[e_in]["n"], frames[i]["n"]) + + +def render_s3() -> list[str]: + import slabs as S + from s3_verify import Parts, fit_bands + + OUT.mkdir(exist_ok=True) + out = [] + picks = [(L.PlanKind.RECT, 90.0, "p90"), (L.PlanKind.CHAMFER, 45.0, "p45"), (L.PlanKind.L_SHAPE, -90.0, "m90")] + for kind, turn, tag in picks: # corner + two panels each side, tier-0 tower band, vertex at the origin + sched = L.build_schedule(L.default_params(plan_kind=kind)) + band = next(b for b in fit_bands(sched) if b["band"] == L.Band.TOWER.value and b["tier"] == 0) + rec = next(r for r in band["corners"] if abs(r["turn"] - turn) < 1.0e-9) + shapes, bis = _corner_assembly(sched, band, rec) + az = math.degrees(math.atan2(bis[1], bis[0])) % 360.0 + out.append(scad.render_screenshot_rpath( + shapes=shapes, output_path=str(OUT / f"s3_corner_{tag}.png"), + views=[(25, az, f"{kind.value} v{rec['vertex']} turn {turn:+g}: outside"), + (25, (az + 180.0) % 360.0, "inside"), (90, 0, "plan from +Z"), (-90, 0, "plan from below")], + view_up=(0.0, 0.0, 1.0), show_callouts=False, show_legend=False)) + close, _ = _corner_assembly(sched, band, rec, n_side=1) + out.append(scad.render_screenshot_rpath( + shapes=close, output_path=str(OUT / f"s3_corner_{tag}_plan.png"), view=(90.0, 0.0), zoom=10.0, + view_up=(0.0, 1.0, 0.0), show_callouts=False, show_legend=False)) + + for kind in L.PlanKind: # slab stack + every corner column: the structural skeleton of the facade + sched = L.build_schedule(L.default_params(plan_kind=kind)) + parts = Parts(sched) + slab = {k: S.make_slab_part(sched, k).value.body for k in range(len(sched.tiers))} + shapes = [scad.translate_shape(shape=slab[i["tier"]], vector=(0.0, 0.0, i["level"])) + for i in L.slab_instances(sched)] + for band in sched.bands: + for level in L.band_levels(sched, band["band_id"]): + shapes += [parts.corner(band, rec, level) for rec in band["corners"]] + out.append(scad.render_screenshot_rpath( + shapes=shapes, output_path=str(OUT / f"s3_skeleton_{kind.value}.png"), views=MASSING_VIEWS, + view_up=(0.0, 0.0, 1.0), show_callouts=False, show_legend=False)) + + sched = L.build_schedule(L.default_params()) # entrance: south lobby rows + corners + canopy + ground slab + parts, lobby = Parts(sched), sched.band("lobby") + shapes = [S.make_canopy_part(sched).value.body] + for level in L.band_levels(sched, "lobby"): + shapes += [parts.panel(lobby, r, level) for r in lobby["panels"] if r["edge"] == 0] + shapes += [parts.corner(lobby, r, level) for r in lobby["corners"] if r["vertex"] in (0, 1)] + shapes.append(S.make_slab_part(sched, 0).value.body) + out.append(scad.render_screenshot_rpath( + shapes=shapes, output_path=str(OUT / "s3_canopy.png"), + views=[(15, 240, "iso, south-west"), (0, 270, "south elevation"), (0, 0, "from east: canopy on the row joint"), + (55, 300, "high, south-east")], + view_up=(0.0, 0.0, 1.0), show_callouts=False, show_legend=False)) + return out + + +def _near(sched: L.FacadeSchedule, band: dict, shapes: dict, vertex: int, radius: float) -> list: + """Placed band components whose frame origin lies within radius (plan) of a tier vertex.""" + import floor as F + + vx, vy = sched.tiers[band["tier"]][vertex] + near = {c["component_id"] for c in F.band_components(sched, band) + if math.hypot(c["frame"]["origin"][0] - vx, c["frame"]["origin"][1] - vy) < radius} + return [s for cid, s in shapes.items() if cid in near] + + +def render_s4() -> list[str]: + import floor as F + from s4_verify import placed + + OUT.mkdir(exist_ok=True) + out = [] + sched = L.build_schedule(L.default_params()) + for band_id, views in ( + ("tier0-phase0", [(25, 225, "tier0-phase0 (floor 1): iso south-west"), (25, 45, "iso north-east (chamfer)"), + (0, 270, "south elevation"), (90, 0, "plan from +Z")]), + ("lobby", [(20, 225, "lobby, 2 rows: iso south-west"), (0, 270, "south elevation")])): + band = sched.band(band_id) + asm = F.make_band_assembly(sched, band_id).value # rendered from the solved placements + shapes = {c.component_id: placed(c) for c in asm.components} + out.append(scad.render_screenshot_rpath( + shapes=list(shapes.values()), output_path=str(OUT / f"s4_band_{band_id}.png"), views=views, + view_up=(0.0, 0.0, 1.0), show_callouts=False, show_legend=False)) + if band_id != "tier0-phase0": + continue + chamfer = next(r["vertex"] for r in band["corners"] if abs(r["turn"] - 45.0) < 1.0e-9) + out.append(scad.render_screenshot_rpath( # joints at plan scale: chamfer corner, fins on the east face + shapes=_near(sched, band, shapes, chamfer, 3500.0), output_path=str(OUT / "s4_plan_chamfer.png"), + view=(90.0, 0.0), view_up=(0.0, 1.0, 0.0), show_callouts=False, show_legend=False)) + sw = next(r["vertex"] for r in band["corners"] if abs(r["turn"] - 90.0) < 1.0e-9) + out.append(scad.render_screenshot_rpath( + shapes=_near(sched, band, shapes, sw, 2600.0), output_path=str(OUT / "s4_corner_sw.png"), + views=[(20, 225, f"v{sw} +90 corner: outside"), (20, 45, "inside"), (90, 0, "plan from +Z"), + (0, 270, "south elevation")], + view_up=(0.0, 0.0, 1.0), show_callouts=False, show_legend=False)) + return out + + +def _clip(shape, lo: tuple, hi: tuple): + """Diagnostic: shape ∩ axis box (for close-ups of whole-plan slabs).""" + from OCP.BRepAlgoAPI import BRepAlgoAPI_Common + from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox + from OCP.gp import gp_Pnt + + return BRepAlgoAPI_Common(shape, BRepPrimAPI_MakeBox(gp_Pnt(*lo), gp_Pnt(*hi)).Shape()).Shape() + + +def render_s5() -> list[str]: + from tower import make_tower + from s5_verify import realize + + OUT.mkdir(exist_ok=True) + out = [] + sched = L.build_schedule(L.default_params()) + p = sched.params + asm = make_tower(sched).value + whole = scad.make_compound_from_assembly_rcompound(assembly=asm).wrapped # the SDK's flattened tower (the renderer takes Solid / raw TopoDS only) + out.append(scad.render_screenshot_rpath( + shapes=[whole], output_path=str(OUT / "s5_tower.png"), + views=[(20, 225, "tower: iso south-west"), (20, 45, "iso north-east (chamfer)"), (0, 270, "south elevation"), + (90, 0, "plan from +Z")], view_up=(0.0, 0.0, 1.0), show_callouts=False, show_legend=False)) + out.append(scad.render_screenshot_rpath( + shapes=[whole], output_path=str(OUT / "s5_south.png"), view=(0.0, 270.0), view_up=(0.0, 0.0, 1.0), + show_callouts=False, show_legend=False)) + # setback close-up: first tier roof at the SW corner, two floors either side, parapet, roof slab + comps = {c.component_id: c for c in asm.components} + top0 = p.setback_every + vx, vy = sched.tiers[0][0] + r = 7000.0 + lo, hi = (vx - r, vy - r, sched.levels[f"floor{top0 - 1}"] - 1.0), (vx + r, vy + r, sched.levels[f"floor{top0 + 3}"]) + shapes = [] + for cid in (f"floor{top0 - 1}", f"floor{top0}", "parapet0", "slab-roof0", f"slab-floor{top0}", + f"floor{top0 + 1}", f"floor{top0 + 2}", f"slab-floor{top0 + 2}"): + for pid, s in realize(comps[cid]).items(): + if not pid: + shapes.append(_clip(s, lo, hi)) + continue + b = tight_bbox(s) + if lo[0] < (b[0] + b[3]) / 2 < hi[0] and lo[1] < (b[1] + b[4]) / 2 < hi[1]: + shapes.append(s) + out.append(scad.render_screenshot_rpath( + shapes=shapes, output_path=str(OUT / "s5_setback.png"), + views=[(25, 225, f"tier 0 roof / tier 1 setback at v0 (floors {top0 - 1}-{top0 + 2})"), + (25, 135, "from south-east"), (0, 270, "south elevation"), (0, 180, "west elevation")], + view_up=(0.0, 0.0, 1.0), show_callouts=False, show_legend=False)) + return out + + +def render_s1(kinds) -> list[str]: + OUT.mkdir(exist_ok=True) + out = [] + for kind in kinds: + sched = L.build_schedule(L.default_params(plan_kind=L.PlanKind(kind))) + out.append(scad.render_screenshot_rpath(shapes=massing(sched), output_path=str(OUT / f"s1_massing_{kind}.png"), + views=MASSING_VIEWS, view_up=(0.0, 0.0, 1.0), show_callouts=False, + show_legend=False)) + out.append(plan_figure(sched, OUT / f"s1_plan_{kind}.png")) + out.append(elevation_figure(sched, OUT / f"s1_elevation_{kind}.png")) + return out + + +if __name__ == "__main__": + stage = sys.argv[1] if len(sys.argv) > 1 else "s1" + if stage == "s1": + for item in render_s1(sys.argv[2:] or [k.value for k in L.PlanKind]): + print(item) + elif stage == "s2": + for item in render_s2(): + print(item) + elif stage == "s3": + for item in render_s3(): + print(item) + elif stage == "s4": + for item in render_s4(): + print(item) + elif stage == "s5": + for item in render_s5(): + print(item) + else: + raise SystemExit(f"unknown stage {stage}") diff --git a/examples/pcg_facade_tower/verify/renders/s1_elevation_chamfer.png b/examples/pcg_facade_tower/verify/renders/s1_elevation_chamfer.png new file mode 100644 index 0000000000000000000000000000000000000000..59fc719ec7c77a52c83ff3b6dabdf90fe0b14139 GIT binary patch literal 87149 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

S(<6^k)=+i$ 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 Wty*JhmIV6M%JSFb@~__b*Z%?ST*o>9 literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s1_elevation_l_shape.png b/examples/pcg_facade_tower/verify/renders/s1_elevation_l_shape.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9bb48fbdbb65e604d1fe0c400ded19aef0ad3f GIT binary patch literal 88080 zcmdSBcT`hZ+dhoS2s4U^qI7~_K@q7EIygW;q=+EB3DTrVuOXr{^dgFY0)l{40qH#v zAw)sI&;kUA5)cR_29f{?NxqYLX5M+9Ki;)||9)pJmITi^*(ZDN`@XLGzOE$SHZ$b; zP53ts4i281M*4R+IDS3P!Et1i`zY`i%tf1C;2-r+1KUu`K+n*Kd%+$YruRZ0`UQsi z`M61hdjyC01O_NwQ;@%=dR4+ZH1uJJx}2Q<|D16xFxX43*CA{KxXZ5(jqE}=I8HO! zKZm%o)&Af(#KCb>|Atj$!N&ZtJV%2<`7OeT|L?y`T$I20=+OrWZfS{<&s>kMEm(xw z1fA*cO8V_eW$L>W$-{M$67L5~BHgo`9M3pmWFq&qIdctePbXaySbnCfc=VLSc_Bpx zEG}{L;L`IBvPsdatapAMk>$PC2 zRtNn}_!+DSRt#ID*SzmdcWCr>ut-2pK^*FabH;VoWlGHgKhx`9ZojNtIRnPUhR|vd zv>N3Y>P9;1h3t1hB?~(1XC`Ye(`Qs`*JQlh6g!>CGg0y4UKwLCXJI7x^^rsby$f;6 zJZ}5>IE}Jy*%gDMFXU3E-7_b~$HxipfJyj}$M=+z<3syx*dsySRMhk3q1*~^&zk9) zk9mxJ^w{&)+3M=*V_RLs*9+S@ZDrU%1oSJ>DPlfs?UPidNyy5GEc`U@oHKnEqeA|= z*~nv^sGA>=#B}%fBxxK6wo#wUORI3Li>7M*Vz6_QIR$c zommbn#(=Y&lk@XEpSN4=WqWpeh_cMHo6+-~VQ)7RD{WXStb-zD->G-XAwRw}k80ET zp+>B4RWZaKFqFAd6!^diMsI^T`1R?oJS9e=G*S>^Azu{o8JkQxQI1J%%pV49uR2fs7~*6sGGVa*9^4MLMYs^bN+4f zV?tg93a&qAkOD3R8QQeflC(>vuav7F^+ZSMt3UZg{X`BX{@^<=%&0yRDU+f*C#2+A zrguW^yi>^VbsiW({F~a>Q7`SCm%};4%}vvl*D(PWM}yK&Q+_TzH@{ZrK%--TnORgP zteL~2UnzPFRvx~IsdLJ|*8c4=`HPo!Q+r(st>fYMk0s8r1j{1frr;En)AWn8&J)k~ z7;`JyU??4n6MwkhI~ZCFr5CaGi`M#2n_s29*`pgBc{)U}N!V$rhstguSWKk$>c)mi zAavbfJmri`qmw0ynGAQ$_iw%F;NNmr{pW`xshY>n&-!x8>)?e(jj#b-{-lr(hq(Ar zFG(lKzj1sWx!9(DgoER2Qv3b^DHGNmY1@E{qx)~S6-F$mX#wlkXM2gN(UbnIScgf< zT>C{X@n<~;g8a>rCmZ(jBvzV|t z_V(5|i-BOZMY=BR_F{Dd+P^1Ax-Q;wp^aVS9Vf!+TYlKj{W~-a0v`ED!4dl9^5M;r zO_W}B!*50@anj4{54Od>#%@{*5J7jMMjLUUvttT~-9HnoWkx}2%MF*xANOD)ZWf2@uPG7+26`o zmV;e>tSHHG>G1?)T?DrWp?%=eem@h2Hku1UiTRKgkw_-<8<&nPXMjFE^7}EDyttoF zK>WR;=_wMW+k2Q`8%Wi}e(H*0KuxrOD$zbjxqup z0;qH%lo(?m;hXK1&C9`2YITHTpno)u+SLBUj=r6XD7e7T6?C?2#SmRf)T-L+>TPllTe^~E!t`+l4Y2m*^0Q3%9I$C zrzN5vv=#(!pt63{qy-m48H)ml>5>ek%?VZ}wY%CbFnT<{vG7T{ht759Wpys+mIrtJ z2hxOEPMd26eGRL#Z7A8>oo(^;t&d%nNgZ9-h3}@*<{n6}gJ)_eg4$Alz4_oe#?kUB zYdA12WMciG55&A(7DPrH25#>I8#8ruJ&XxsuE13GfyrP}7k5MgyBqd)fw<^+K!0}Y z+RXiqAvr{>ySm24`##TgoO`C$19lAY?@QpxcLaB@I}v9$G}k^H;l0YFy09oNJfO^7 zAVk|Mz25)gHPyNhy*}HsyU;~y+GFi)?2p2jNn_Q4eM8RF#zoC@1V({RrS*022WYMd$_OUBHz&d#Zb7}RP$$K%b>xO+zZLXN~94WAyXhS=%;9x99i=lW_ z*&a)#zB{-dMQ^0N=+%dHPg*;i*=!<)$L)6EWZ|sO=5dYIKdw`N?C%RC>)NpJ@G0@w zpS|ftsJLi!sfl zY(4Zr^<+Mr1x=>C#J4z%f5T_`q!UR3Ms}W>->7jsP_}3Dd+B+Q|y+UFGN*wufnxw(hdKzgd3mHke_sM-JE%LPd z!or5m@tEVOP^^F3b{gqJSS1l-S2U0g9TrSd+a4?ObgK~Q=r*v^tQA75oz`yEGu0&fkdjJ{N= zh!ok)aR>m`EgZ+%g|T+sj99kXgohLJMiqV}PcMf5D7*wdptTCyON2>p^KW{dU(XCb z6&RNw-4t!db76`vFk=dPvm3Z!$1bc3c7BNJpGz7DfPy9}0+Q5$w1Mc1eA4sUY-yK{ zW5qpybk~Xoa$(lTqE-sQ-$XXiHUkbbBbTXL>59rj-Eo5vNw+b z>ueNkvc~zYiGhUxDoIf6azA#8(mIL2efBAXZs;zbwtTDKm2_E-Fg~O2l#bS;naL^H z+A)C8cop(7Nin7KOjI&@npOitWbHibov3iO2Lez~_gox(Gc{Tm^-WOW%}cmn@c|@% z4OWnh@6$!)&7sm)+e&m&@$M7f_mZ=;-0X|tZuZrA&#sntCx;~OiLo+Nz9vD2{N7Ww zZJnx$nhd&9q2iPaggM(PVv%5wJXt5O(p+I8f>1>BQaEgwR&Y|PMgL{L_h|)MzfnIk zle}mP^676yc`K)9I|=z;qBRNrd1+*yu;Qn1=d-Tm!}QQD{J~X7M^dLa^g|Os0~QZD z7MzE)xx|f@WC#Ii%8J>xKa!*}q|5bF_>A0?Gteek*KI}8(RWLD)7D?pqBd_!IU_5> zg06u|qtd9ar0YCNx@m1l8p0hk;C+#jb&JN-8ey!Lu1$>AaM@oQDP2^J!$Eh?V8Wog z4iml88Sv8SNDR|Sglc(wGgCXaw>z%ch zNOF+cD)XXg40eIqT2e%Cac(FaPBXKuk5Mol(_PHNqy$%|`lr%_)&;#&5GTj~)Y|?e zrB{A>yod+<@vALa=1KC-m}+>z!;in_r_u9ltb!HX`Wj>F{vEQ zLaCW$Q*;2@5O|7niQUAjU1-~dL_f{mg z7;i=#xfJA|liAKE0)CjOvDLoV3z;*~B=w(8eKTMVfd2HM`AB>^@(He;bb4rjr!`U# z1P-n5q0YK#QSJ>$fq>*;L*jT?%;o5jl<%c5Y`km>V088 zRWds%7+rd-xH#ab`7K%GK;g{q*%lKGd3B59Ma)pXho^Wy(zq}NkMuRkpqox<(PDH( zLRfZ0wjtxk`fbUFGLIpP-=j45Qq)Cz6)dO<3_FwDuQts!)40EQlxqUFdMd}ONWp2C z?QT{I^rVM4!rcV}^4o>wo$X^9I;93DCC>7F;`6^)emIFbH#vEIDO&QY#MoX1j8-8z ziXKQ9ve8^hqY51otik$aQ*u19V(HuksiLeox*a!Wm!?6;SGo*YnG) z#T$+jJ&~&?OS(&0>B^;y0f5_FD6dP3>msJpAV{ltv@>4y3|-}Lfus)Un-XoY;Uv_f zIXBPq0*%hSn$8d_q7*h()vp4;+;Spu72!rNJ<|j9U+I&fzzL0@aG8MFPgzr8d?^4OU{w(x*w6kKt zYQ$pfrEM{WA?KNX6-abeBARLrWiW6oXprUx5DzIQ_&HwF+xbug?>6n&Q*FVSeK=1KU2hrCv$%t_F1 zCoU1pvPrIP2&7u5=rMdGh=uzUrI!@)!J7-cf{L;ibyzHr6IbUw`*qrdTx!9Ra+T0` zwc-@0b?Rze%}p5h!zS+#RNGQr3%HBZ$dcR_Gh8f+@YC|Mn;8rtiZ=5s&%BBKl#nqd-@kS2)!2mOOTxWA=@G^?}&xw_i)yc`}Vb z^Xh;2-K7C1Im)Qe7GAq?eXoWXSH6{3*prK0$Q*805&PH>va?YDeEeo6i*%!^Y>W3FAQ;FP$C_uIc^1r!)w zmmEnf;mwQ|$0cvakWyW`KPzTAPxLZUZT{T9OVWSLX^X}I3BSk3FlsMxRwZRS_vs2b&o5!fU0BV z6_jJjSXJiG2hT@Y-$Bebdk2X+2j2%qr)nK+j=Rs}*st7X*fov(WsL+r1W;yBxha(} z_gXV*`(hF5DV~iYRPuB14mjGBC)NeDh(K2bAI-P+DsHSbf61otXQDPW?!!zHDQ!Rj zCclhtXke6Gpfc6YeAD6ni4Fwl+C1@+YfKo%DMEJeEm8hky4egB$p77~?BIPT{Ck2( zKqXKb@p-;B#x6Xa#bx@4(@ucI^-{p<*>o=*`phul22>+_)~CXBFs%48)=iMQx1k53 zef9JKMJ;6+h}9Bz1XFZ!7;F~$Ik*iM7em_r^-{rCD<{!P9-izK5Ni*G^a8NW#Kpc< zTJY=$mbU-Vfq?%hQA^kF(Z_m_8pE6e0jakt-czmnsJ+as=DukdkVP;9RTIBAH+c6khTMl=T|Z)0e-eArQn8=^ z7silM`Tf;=sxH)WqHFap{=L4n6(CKdR9zF^_bEf9UG{OCVJgwS*DkI{kH#!0l`!KZj?@Mgt3%NS0%wW}g9e21 zV-d_KmbN-m>oycX+Bmz|H~^^g*qw0iff=zPF!p9(4~E#qLRoFrM*+BeHPc7_iI~?>^?@bL0DY%-D;?S` z=1w>mn?oamE!yavKR+Hz9mU(KPqe0&eMxwg;#V9}6x~J85u3P8SodD4K>MU{q+}mRk^FVk^zLLIy8aD0lOqtrzp01z4aWq=G_*j@}CZrB!H$nX@`i`;5N2?)yBX zKFcox8eI)+nA-d@CssGi4jgkrGjBz6Ma{tOL>YWU)jTt#YUo;*-=}86^86=rTsIVW z{L9*@{>gD9cHUIbngA*r1B*L-Cp7#%?4;#A12Y$PMemhi^eI(~ZnG_&s)lM??f4WH zi(Tn(c<UpZ z&((Q!*v>2rD7wzrR+MH&v$4JdJa*r6$e<@BZkfIG6vTFYop)X>YFNl6zB(MEY}xu^ zrvCU68vy5Q#vIh7hCGEcZVO>1f_N`wTnZY&B0zO6&-K-)xLk_Q#dRHp7OXB^jN?(3 zf`Zqm6)JOK9etlx4I?S8)41$>;qd&qu+viwnl7%D}ycZH`MhgM1_bTGC+J0WtiIutb?(P9p@xT&hz1>~PsV-e8}bE_bR~ji+V8;tauMi5ps3WssbXzK{cbgpKn;}i zRRw}>cOm0Xx!5;?XJoZyEVC`i0CKpM)P};FE=MXg!$F3Peon_zaj-v1XbwFJ&n(ka zEfc(z06xjh4aFs-$H~y@nTxWR=$@o-0Op0sL5?N+C-Di>QY~7KMvu1!YNR$M#evI5 zlfe5Td>;H^rCCKGBWhmLWWutD6r4xJA2RV)P(gM!5XTo+Vp1|p_Sci*140`2`36&{ z0aRQD?KObiCq|9N0F@XBNoXT|TM#KxULmx#2P8fsE{oi7Bv~;Dty;n>nk;x%5~7lv z6-hJm;R9e(rlcIBLeZbxeP1;QuHYzKx>hv!6yI(ED!dA@UDF}x;$SEhRMM{u!v|^T z?!}$&vk$ivQ!OmqXk8Ek7S`KAXqY=7Jq2D$jM7WFQXLEV_NIRy`>=GY ze^sm@<2xiEC9Vw}joF>H*6~X1?w7u(&}fy$dA9VPfsQC$4WhkP9~ba7BDyon`SfJ{ zuY@6t;gu?L4Iza4{eBuh>`A)cgiaxi2wx))TOPo&>AF%!1||y8#D4RMKUE{r$@o}l zNR_`;Hqv!jXRcD7g68J3cY%^$LLgVu(DrUPWXJBq@jnfspZL4HYeMs#GL$LTPIV7X zyN_Kpa`DKuSvm)KkroZ|*MLN(#~cpQ7DN%@sE^+VYtUgTS4J${^cw~5N<%tR(DNk$ z1C&5VDdpg+mum_LZvBOVzo>$**Fdit_d!{|M z(Lo*Ma1Aw?Im+RGt(=~8Szr-jHTNMyNsW|CY;eOGy|(7(oBhwC($-0a;Ly{ z?t{5Z-u%S`GuRQW`$<)iznhGoiUV-J00Mu}1?MwIi~bhRHD)^tlvKg=tApngz7y-U z(=A*Scnnr`WX*7+1T3yHZ}HrqX22Y3^!9#6;+de+;K#{FWmu4YcyfLrv|?{vPW&jP zD4>|Qi@)(%cVEyOH^8$N`SfhBJ?WukLWl0Z zr`-wEOFu59la~jn68AoH$U;HPT=Q!()UinX9r5;0Mn!0H@hk31X^ls6gA%li_;Pr1 zaEecTNr3)sv{8;&wUdF)S@4uQp)c~}NnWi|zY-Ubn>|}K3nxVUWrD`l1KdzNKiY51 z>wF6-?gW2rCG$)r!PUhpQBM*e6(!Y}u6V+NH!^*P`+U-)FWj6dkG|$TP$+*|h1q>W zYXx?BIApf%&poq^Q6?6|d(3UHs^NBh1q17=nVrHleqzjbO<7h6qNsFkj${?3IkH>BFyH$*R(#Zf z2CXJfJGh;=aCtxCVo^_)!S%M_W2~L*^esf4BlA7*eAiOF+0J zGb3>(Xk-dDSRD;FRPV87DcZL`{9YWdA2gTQDq#7|z(w9x!b0n*L{9350UFtl5-zxg z{OMdhvZ$!E7h`aGwa_&iCCcd*9Cg@SfHyf>D>AELwoqLh- zb;Kc0K7DbFTu`kTCNWIGGH2#?Ly=@n_^)lEQrs`bFXbW3bqi zM@5l)V!Sbggy_}r-EsySVux;jz9axXijViyBqt?41u`k;jWnwN9!*_xvwdIZsb|3A z@o;?Hdp_NSE6?M_-In0@=3w(dPki5JU8UhFW!wwtTU~(-L@p((_jh7-26e<&k6V{R zL3dE;la*XSJ8}fOw0=I`Z`wc;&wsnnF)XNA*k8{h$v-{6illojAaCGEetVS&MSfwr z035h*aR_B}C+JA)ONm-*!FNu`C!Ot8;$Z|96UTB$yL~c{@j7B53TcX)a|=y8cCEdb z`*Dg0jr2ilP*wb!;mJ|mu)s=fNg8139yco z;B;^j-j*-05)~x1aNMQY+oCTjUplyz(YQ-AqD{y5GZFXXQux5=a;}SWn)t~z zq6LDW)5-TPm0 zpHJZf(}``|W9b&|i!{alZOXSNCzsFk8j_+I-x;o@Z}g)ko^VR4Y8-BmH2N0Eq6Vfu z%Jw|`UidDK*`Bdl&$Q!w%5&kdmRsmt`$EPe3Y=j%fdeXvGwX6e{r|J_k1L!qakNAR zb+eA~bPV}QQ_x4G-nS6d@e2^nax$-VYS=)_$n9SAa7wf&MLEuGVs2H+-Ky!$;b*}B z|NT>eX3_oiWc)+DWZ!fEb}PzS3jMXpb&9WRrz+Dj;4>T7!;*>@xNoO$lvajV)Vmd7 zuwl4dTS-;f$ARpoYT&bQGK}v%j6uN&V3J@I8`$+~&BGifp@1gERWvF83Qzz$_#-m! zBySgf0B<1Rq`XLmGb!}~U~c?CEDr3*^~$<9pcwobKVXIfzr@GKGU5lkaeiXPn&)eA z{X}2o(n#fMxW7WQIZNa=qYYsZboyFAC$cZ|``~49>;5O1@#RyM^$5O(KsV#$ye;?Q zwpSwiaTA%5zKvOz)fPR2Cop*@E{gY~^mc3mH6IE4JBhA6Nt>1>hMpxW6)8L*GH@T`jdfhV)cLoP#{M`+eL9s9{eWB7NPd zXVL0YEiSt?KZ5iF#Dn7^0Yxir5A46C4f4YI*C5shaELTiMYrPVx@=@ls3faIx=+nLW9sLu( zlPp11*JhnGza&#t=Sc4nXmQ>lt8mtYvBI`)TJTvZ-V@i2@A!piDyKavhL@g4BJel9 zKcu^#_ps)*5?R%}I(rvNoAf*wLLA)cv+OoFiDY+!C+ZgGN?8i7?`CgqjB-O#ETr7} zv*8f+;h(w;Ur|s=5fP>>7}oHGjmkRoIMMxj`)_6`Y|h2`19JNg=coSbR%s_NHlj`I zht&F#KP(86F6bA-G=GXq8=V{Z{!zCy6&VHLRJg8QyZ$i#2%pug&Qs}rgw%9syU&Zo z9l-|0vE(?s6lnj`00PPH!}sVUtj0Wd>J!=Iob#*XwQ@5Z2HEYmX6|Q0vJll@71Be~ zLdR@4`Ss^T0`%Vr8h{T!TPz5D?^_c2D;{VY&bN;UZYn{Z5H!a84m8T!Qa+^5Eyk_` zE&3~u^%e_CEi4l8+IrC0P3H2M#m@W9gmEpZR)#^8L9uJvoryNt0ckabD=s+nli<`U z#7Ead9`1L|C_dv{>Ts&SGC$*%7SThd#$`>88pFxZ7os9^(iPMAsIP>Q+gaDcSOSZ* zqXozyi3wsYrS?eHfa?v6UJoZwXa5ReD*whIXnCZE5e`s5<=F8D@AGpQ73!7dF3NfB zXnRD5_~MPneC=7Wz z;QhE!m;xxQ5P1OAx)ZhcJrNuy&gSjuO}3ur7Z2&raiq3Mtb-NkDU4I`m)POv=byjet(pGFCR-yw5MF=FH8hoei;lX;8!>yc@xaE;#aaS0?l+Lpwi-HSnh-6mg z4qkPN0{h_58ZGb5a(CoRpw`QjuDR&3+&whEi3N1FX1zYb`&QgfG%H zviWb|paux6cTXy_o5=0THzCBh$C*gItCP468##+ASFMmMJuz|QPzeu20<9Z=B&#j@ zwtdf+qqi!=y|3R^=X-zV5I5h!8BBC~3R(z1C;d2>t20j8fm2=I)kyR-oqCJiBks;a zN9fn6iVsA2;#!4E?+-LGU~Yp*ZrxNC(ShaO|M8?$EcGrcqDN;`mbRl>pX%GwTdps% zT5xeTbOQ^Q$}lJnA)n!kJ#zyZW?^RG3>}qP?DQ`Vsp0;V5`NMjPMnBPQ1mH~Bg@sR z1|Zc;XO_?0FhlS1oGL+_&LXkAQ zx?%<>sQwtoBecTrr`RQrQn0vlzsMh?DUWW7DA;%r;;i-XUYXnU8ZUHJ4{5p|DWke@ zK2=0kuV-Ey?7w)9uCYMMXa>4y0z;^5-5|?%Ocn2?%Mh{T{2m2K)8ime;M0L&WTc3y zxOV@OE!ypEK3o1k8?d^hz6qYc^ku)uWL743N(yDU;DPL*_F7M1mEr{2pr!lRqi-s=u$7+eH2QAE#3;^DX{xlH&Cv zEbP4A<>$TQwv_5y*HJ!g2t|ip&8Ij~EvslR8T=N1)LC;cL!=wL5a~{m zsAh!vPcBZG&WZ2u+b_*fudY;5@PK5y z%;~1*!y9@O%IMw(&~%a322)0$BUKHz!vIRZjdzf8Taw zBtKn4JRHe?r(u*Z-jY_9nbhW@!xl9L;!#gBz4g$${X9F7w@>n7=$Ibq@kseoP~*8J zIC<<=zIcO#xV?T%I@d1>rZ+iL`_&Upm3m~Wxj{^nPQ}{>9VA)kFV=n+j5>e#GF{sw z{ZXMbw$dGqLh5x2-j$;2rQMf*<@2lLBgxr^OXp|_l}!!A#q`y9NJEnL1#v6L(;=gB zAtB?ml#_HSptX5up@TnXk#_P-skH&r_Xp1kt*>Miv-tfc`2r;iKJb8*QI;uY)Lb>4 zp;|skCviunRb4F^IdNv`B=575`2mG<ix z_#}i;Inj^qvOWMk6hqy62hd90l4y?KuL?x1Y7Cld&8vE)hOBab5dLfwA5SyT(d#BNV>%0Yu#>E&=sAZ{ravh%?Xhdf$9yG8T zR0*z}hYc3+^q`T`jE8CV)38?`+7oKHS|$va(|iFD=yfIkAo6m*aA%9R;C7XdSbfuQ!dtdEkPE)q;R^^yAqqBU;K&8zE+fqc_r5yAu0i9ugd zw$pqO-kDjr_O0a3DcJei%3O-NcyH`ExC3ZXZiJF>YEx;%+>P#*U7(6dXYg-cb-tbK zZf1fn=qgyW6~_utE@f0G5L{!ygO>(nMtEo$f@i`cM`}y189HP(rok`NVer#;>ak%K zVEk+&(J03PLy*fhz^3{>ZXnpuQgz?Z!t6!Cl27GYb!P8(E0ciy7V&(!l$FL*%#fp0 zu^`c=VyN!+x@1j5XQ>aDsdk(K$PP=~Cw4IC_@}bXcmw0r-GX*U<2_EH|kd1{yY0K+D!1K71YH*Eshk zQQRKOR>;tqfS&p8yWQq-Gwj|BK2yh8W9N&KZ`Wq4gFj)Ss^!mP0#n*Q<9R1?0ENU% zBXkGK++V?j1Nw?Z4HCV3XGBDPl&$rC0Mz6ivx+|LJO|o8vxm4uZ)+@PTRw;YPV|gQ z?FJKMT=tFqGqtGFWAh%lP7jJ`6BQ3^T%Z(B4-o+27%=G~mG9hUz}??@p49CE4K!3HUNVbCZ9~l8p3U0Qt#FdDeplJUVi4=Y!onuYP4lg>p85U{*v0uxK$H89 z!PXdE9Aa)oAZoM#X_?%V7N8lQT?cfKvqyL}<^AAv!rIzp>UTg9&>p1WrUS9p0VLH4 z@07yWvMA@6-ebJL@vhQE84oJEFe+ zZq^)_TRzIAb5u)~CIp(-t|5C^X=V?R)Y_i4fn{2U| z=g%@**UxNYCk5qLK{d!!6>SEIDW*bi1Rjn{|?52S*yE&FP zUl%_Gw$%c9CQ)ecK)8We%vMN|!$g;tCSIrokd^p8_uv}D-1aft*Jl&~ZP#MPfUQtn zrkJ-#$!k#Xr*j6_+Fg7-(06&j&Y5~EXV~h()SYM3ZRl_+px>WmcZG&?L_SA-c0H;Q zmk^%;lUf@(syM9;k{(sd6uAe;C|lT4U)3MT2KOIdUbe8cj)02+>etj6cR)f3Y-$ni zAH=bne+BN!js8-Xn>>bc&V*f{GSY;UQt&X*dahZ_la`tW6Ffm07z290Slj?syLIT7`Qw7f!PRqlO$F?5vE+&HB94sk?lXU})GmZ{fwp z2@|bA-`L*J&~UT($%!i?$WmNpr#)5er)$Xq>iR%u*!odNFP6&5lA;=r0L|rAx^=cg z!7WsS%Is}XLwxMT*@v*8Edfk$P~5CdK`!LARAE*UR1}x$TN1CySTmPniqk!%gW&u_ z222`#$c1^Q#_9?ZCkF`QZ>)P1RGcX5>grlWENa%UI*_^)*)idb6?Ws+H+>I~Lf?%6 zMrcE}Y}ir-t;5pR9d<=Jv@^p`uJJ4Z8b_J!v-|Z$D@B01x`nci32gQ2i9117y4?jb zx=J6*g@=AX^c*b9$^9iD1;ie)aL8?8iKU!x-b)m-E+F>PN*Fpo z4NZ3B2EJY8EI{}ynzPy$lC`A=eMSn@ko#7Sm&jCVz_Wn}_)cNT0%S%XBoviFJz%SZ zDgzmlnWQI-vS2GG3yMW?Z$}*XyEZoh>VWLR^(}qNQ4i9uiK5x}F zw(kD^Tbh~4k+Y?a{SIF{ko=oRZ0}SWSixh2t&2Ved3^Dz3%on8 zwT#7o#UsgwKucYtyUmX0HF6ES!XI@=iKk)m8l@lm3^c;hFUPpOD$1L!WHtA0N*~U0 zn_UJnL)-`EcR(J0I*k)>&YVSY-{koEvF(0h)36G*Y;C-v!del4=lEd-l<4y*z*})v z&ba^x&pCinwlj2pIky53Fvv1~fDxA=9*13*051aX+x&peD#07q>+S}?_kV=0z0EDR zYw|q90^I|nf?}zd(@^C=5*k%W|EPd<};Fuu;CY-X7kr6lJqP;fP z^N-LPOHcL2S}@M}+Q7oDxLad=rqqDRj<9INZxFWWipCyc^CxytyO%oyxM4(obNt(k znx7fzEzmB|B&hvoZ>_5j_wqfY+BO9W7>Yv|lzxup<0U6m4x;92;Zx0_p zzhSE6`Ncad{O?opzWrqj0=yFCQW>g}vbOJwCua`5IxpdKIK{OLsGQbK&isAqBU8s% z5^`-b5Y}}kKFCaWjFVqVYEomH9g2W!{&SY=%-t8?(M6QDoik?dkvS#8@w=j2S@(|;dJ{v9{OzB`iCez}TWGCcag zhwsqMzi+{zyfHtyIX?2j$KSyXR#$sVfO;)3Oy#2T|2pI9<1A{miH+OwYW2OMf3D+z z3~=8(UVW!3tvYl85S3T3#T^qD=o1y%*VpDXE*DbgYW8ff1I&$+;`bGSSHb_J%2 zRnceSTHFl@PL$lMYv!}}Fl3T%ZW{I=b5f;XZ*b-90wvSqCTuLtf80<9W;b;Z2*_vG z-WcvQ$G;z+Gp3Egbi(EW`fQgF^Yk~s@*uw)jrE+s1t#KeC}D3ym^f-{+glzHl`_Y2 zlb6o`mq1gk9<5fkh^9WGx$`Ax{zUL=%<|T)b;cSE_GN`ec?q{+<n3F%Woa znC7mY!yri_f{E{aFv8XT{G#b#=ZUqp)>uF$;^7dm8(z>QSG!xW9=%P)bc};WQBP#w z$_+!!6kcck;@)rqy7n_n`f$|LT$K6XTlb3nwRkI`f1XS2EGCaVy^NQQJpW9ybUNSv zm>a!q!-6l|#YPUcK6v|VjAp&!=B5PfxWA9v!v8KAT_1KY^FN0!{^H#`9>yA(@#FCE z&!+sFjvD`5@+jzk?=fLOhX42fe0@(?GA51JRku)wvHJJ^_xvAci0 z=Y^IU<3Rck{}TEChhg?zd2U&47J&0XUlFk{Jd*Z*M1ubs#s92GgcN~3N^rYuSBhcq=ki=47X+YSY9#B?R&UiA26OJ%NU$$LWMC= zej?>&<~=XR>dn?Zy=M7)>5Ei)IH2CGy$I^zanE9f6BF$j48;tt;iWfe2j;JoFE3lw z{z#Y2jq@FK*J=9zKHAKPQnq7Dyg>sdQ=bK`HOaJgu1U zSt$Cm&!qeQ;R`=T>&ifmL1u)lt&wMOHa0fVQ+!^Y*o054%&GF`2LW(0?%?%8bKNC# znv%wqwUYYR`JG*$TOFaM&P8S#kwhy8EuCAm$&o*+c3Ur0wMKj7kYh9iJV#l-AUui9Q)E4Jb17`K}kL9seC%EH1zju`LnGOcgk9UNN~ zf)|7c6W1^pbaktvwT7(@u5sdU_IaSOXedv)Exe&$_wOxDAx7e1RkyIwaDwkRe&d+Y>znF?Q!NWOy{p1E)< zrwl-t*I$g3hWPp{_gyZvzr61^uQD-KZD=_~Uiq?R>Z|libiZF#$B>R+WNb76TB+f% zGSfxt4Ju^jZ9GB7l+Sj?#(UMsM6IvQ&qrZ{wxI80_qWT(ih#^o33`|lrs+MYlKp}O zm~ff_0Gw@ERum#O7U;kKhv&Lm4Yqf_hI;E3arAV7u()l*HD8*0Lk0!gx=SjbL>+;y z<=|{Gk?I36F0bgbKi;ed82fH@Us`UazV@)goMU{KwY%-pDaL*xW#fPIWqOVE9gjOA z=Bd{H_-@ma`zU8F_9^V+;_?3@O!QSx8dtZHvi-Ak?1upK@%N$Y^KT;K_^(@revdIk zs>&h|^!a=SgBP}^7mbv0&hi|6UFi8GFYAQb($i3YWt*&S^Zy$np6sm}>b$akXRGiH z2k783nj=Yzp@5t1EiYj9TVqS;qL;D^$Bwz|eI&DAeaxx4jQ!`0y=~vx-<-VpqIJZ@ z4$x}j$^e6$9HUR?Ku>*t={cBAXFEID*5bE-TTB5URdGl!lz5EaEC6xFy8zx83dj`C zNXeKg{~LfF#i{sBKLxxBZEpp7Rt?tJT`#aqks%1G3bjfMl}N1*7S!9$-10HRDGAXr^vGbA><9Ao#fhI8yXLw!gw?15|q zY8()~cIP8pUM2lI+h5-sUyr-uUx;`J+{>TZ#;r)3Mro_~3A3g6V*u`aWv0GXb|V+S zl%}MZ*=C=7Mr~=S`*V+r|0@&u1zm&hEj9z4m;jaE#~xnm+Gr#{FFH8SHr<#2r4ymh zj=zc!V&kopw(!ka)0~&y{|@0jGTF7vAoXness^7Uf2m~8(gnGjJ3oeR0dqjVXjxxt z-%`Ejw>8({)BE_B{DazhI&-%vzC0wKoAbOyCxA}M;h^+ztdK&pgY2@RZ}i)>*w$bX zNtXHXxLi3#M%8`-CST=3;67&eMp*u(gbzb+8YvrAwV69$vvJUKsC-y7VK_T3%-E1n z`J=X?1K8Vfm3MsVVqXor2%(->2j~gy7b*MP8LYA&#+Vx+D9e^EhB8<;p-optb1VwK z`NPDwv&fsGF3AYjS!mv-)5c_3w(@7!r%wUlAEPoZ@T2GQRD-K?_5E&mR-C)X#KyAW zmah>omjk(Zb+zhMg%y4x&;{|BjfQ47WD1!trxB|2s=$?k4uLV`BDQ0f+e$Q|5)UR>FEwW385V^nF&05%7#EEt|Jh z>)WEd>R#b*V{*%yOJa7u#}3JdwY`+B(es#)g8I076pZJb`YSu6Zb9XN?9d=kl)c&A zOziN9*bTQEBNAq{#Iyp5?=VLN4t`MI?dz;|s=i*1E|hx9P9FtoE#+8tL^I(8xP_68 zbJVhDk>S%Z4cz_+xkR8xx@TE7@TPgp?D*K1mrCPoQzyAL5Gum}%4eo*IGXCgmVlFy za&Zljyu(0lvEnVl zu0_hv`b*2Ow6wH*fYQq43L~8r^)lS-wvUIywHmRxo(G6#GBcL91N2vBxi{GpmC4mH zR5^3dMvE+#o8P7r8f;OK#9JXQQY+eWJas$?t*9_?#r24V=MkW*mCEz%Wa%oI2RJ#| zYTK5X72q+8QgA>46MGS+12l@qCT&~_0iUWs8SpI$P@k!Hc58r-_HwyjDql`;CK*@v z?{5D39>8k=svJ-Z>>|QrI)QrA_~nX%XCvD5jpjH8Efi?=mVuZ*6WQNsV1D|=zhCho z_z?&kimRckY{L^EU$4n_0ZqbLf5$uy4)272&n;Fi_X7<6e;vj5UKn4$TRqu20;=@@ z3Iu;2|CPoDvi<-0yYf{}{TeG7fQfnf`D#i1AH4LxE-3e{F?+Cb89NIOJpJdtQ2oEZ zhs1qQ<)62JC||JGFi)Kt0mME3C&c|X0qFW%%+2Nh=VFIW)GkU|iUn{TW3{_VynkL{Oy!tE z#cKUhJ({0T#JRIm||M_Hq=uJysPz(7{X75jqzu4q8 zYDQe}b*`>`T@+jue$Aw(P4;HXq)by84%;DL82)o%ruE!5tT%Av=KTCTfJ*--$Tg|l zqCGDkHIBF&Gv4_+_RvirT2%%2zXXtS)RY1&`~u@!N-Vv&rbb3fCWHxVR(X3jWM}h< zEh-=PJWvOv4PUKUDc{;cHJ0J7M?t9oxdT0D)yW_lA{MY%Y$N{0|Hs~UKsA|f`!dDR zu{#!21Qcw5fGC1=E4@hXpdcbbK)RF=M@Lb*RH;EBAYHoD*Z=_m4NbbzLZ||vm%ROt zM)BM?=bm%#eQUk9)?=+%Yi5)XzI@;Q@BM50Y8h(n#+L(hz6`l~jiJ@oR?Dzun>U%B zuDct&6xH1?)h}@{gE&2%P~~!1rPWD3qV>3k|LS>CdDY28-UE9rif0J?#UuO{BP2!s zcn7Vln6RcgC3|DjCN^XIiKTkH)2Yry_Ni_w=%5A26Dbka^k&ZYkAQPY-TlLX2NXzI zX4Mh$=3feh%g+*n+lkIow_BP7c2L4pYtObky-}y3A9m;+XKFe%A$J!$Te(lLvvV`4 z%F~`;TwS_}Ejm(|mcpjAs~%^g1ovq>`)fLc3U$u2@cDf@Mi6>nAS8eeT?5yLmURoNYSDr`O9b%>Em*pj9 zuz5TB%#=F#4_PbIo7k*NVKQ09x10NI!lrg-=Xs=2D`NjcE6W-22b_c0#Pi?>80uqp zqyGi;Ks-G9y|VoC#+0W_rRW;@pUsCq^n!n==V`Wy;&QYWn&_hf`e7H_S0Ym@D?mE* zwYlRtS4X1qe}DO3X`8u|)Y9UeP=WfpG5g^+IN;{pG6xJs!c3oq{7;7Ja>r97UGwM= zBLJHcp*=VO*#J3UFIoSr9oUKb17QY%e&Q2vOu_+HWbSequ{4fE!sSh~(T+n+1b;B4 zQV>}ZA%xLu{Td$gz}40DH-lwM;|0A|hzIb_5fc-uM?Ngnmi!d91gLTJMybWmNCuDy z4dIujw?EQ`?RpDAAuIvN5+Qggr}M1{rYfAM;$h+AL>CsmZXP@DBTdl5bm6_Y+Vn7X zyDO9>rW(NIB*Ddc{rOK6Ak%g`6o8XR1z~n>qO%`w*Xu(D1#;XwAixh&7A7f()0zhl z=EInUcCz(EbaQe42}*KGx;(O9)f%udX%6*BgW4@do5Rz>VdTiPZ9$1I&?jHAfNohf5%1wT-U1?vhiDd|f{L7b1kN*- zFv9{nvj=2&OqeNSDClIOnqLKZ*b9M&uaE4cCN%hQ>`mDPSqVyw7*RFlkTmneYXs5s zdYil`&yLmViHV(x6zxQZc)z#yPRfyLa!{uo8?xf1EL{&QNWO`t9hyEBLme6#c&Jxd z=%1Z`+Xwsp#=s$fA3m(Ei8&$^D!QXg zI;ZFSgi*N`buAwoKV@9lH`53cC+{Qv=+f(+!3q_(T#^cFqJq_JMTR)t$X_{3;Agyg&PLJfp|6kfCT(kb1zi|2RH8y>x!icN1Gr7e8*U z+M9{6CMsDB9MSa+N$U0Je{meB!H?9H$1MW5x-HHbB3oE_VNWQ~Uun#fA=Jx08w%GJ_RXG_;c!Ew0EMz)q%+>5z%V z>apl+DP#Z-S__V1N86gWO^JD?0|Y`Xj#R@;RRt?py+WNWhUJQbBca}3>fqFLYE9sB zJSCgt5{3^tL9?HBw=cgQAAH3jo_d?7wp!0W#_`JmlxOm#sU}~>R6t&rNPcvi25!%i z3w5ZZq=Z+D?Jq5>v$}KaW1H?1przwV;ma#z?UmdiPA1qWDqXhKQ9nq?xr*;hU7C_C z8VR2(&N<=u#K$!U5EEu&ciSeX&CS6DR$M>H^_1{0%^8n`6c*(xh&VWo#E?{MR4m6z zq+leXg;U(}B?59;_c$1qVjkwwBq?t8*K{Xw!;|=E?p+!0xPuZyzd$Aj&z(|}*qQWz z<=`(Jf-aEbr1$Hw4oDk=_>#EIcOZ+U1pbZYcQYP2*-TH75a)wZs~kX-Zgp(!nO`@b zUp8rRJ*DQ8?(k}Z@U}R<#@i3hEaHA;M!dT6OcxFp0cz`V_tzS>Qy1em58ZPt6SUrP zGGwxR^6KjqP>r(B+D5D0uUc%BZ1f^2FI3*%)sYriZ}zoMZV|mZ9z_#qyZaTHu`igU z4Ycd&&0Wvy^?tCwd`76Z4p%gD7U)3s##dw~Q8phZbgC&%75<3MXyx`fSyZHrD4fk* zv!klTn5>K|X5WLYzAv6_smHyctl90g_Ys=LgX(&^1UmE=OUAPHN%Iblq3pIo=&FVM z+6CLQ#zR|ug*$Z?#U>nq;@^(nlw;LJMa2?*mCKu{0S-KSXhO!)cW6ss#1!&bty!FV zBO{qrNmdBsF^Bj=m+OE z


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 literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s1_massing_chamfer.png b/examples/pcg_facade_tower/verify/renders/s1_massing_chamfer.png new file mode 100644 index 0000000000000000000000000000000000000000..ecade15610283189eebde06daecf9ce1c8ef58a9 GIT binary patch literal 53889 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 XUy7c=M*t-1R8*?UnorA=-UR(WpPOla literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s1_massing_l_shape.png b/examples/pcg_facade_tower/verify/renders/s1_massing_l_shape.png new file mode 100644 index 0000000000000000000000000000000000000000..61fbacff1cdfc5160e0fcc3d828a4d93e312cc1b GIT binary patch literal 56815 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%0Du{*YP8R3zJMO#-Y^T@P0D@PyDvCT z#%96~+TX&XmD*W|fyYuN{RLbE=aOV7c@xyX+ znyEa4v)`Cne5i%-Py5R+z-qy$L$cp~oZ@vk_0P*a`58W=6`a9)1GG_)YYn%|$_x;J z@*MObPwZyyT>taA&5Hfr8WUOv@B`BabOEau<-9&;#*JK;Du!7deQUizy`aLPKPgPD z4x6-`(Ug+t57@GrgdeexXNppyEa|&wGXr0|_=OfJ$<5u-f}c!qvUY=EpA6mU)*4dP ziLNx+zVrV?75m9#*hJID94=ooN~}q%X|8Jd6VK7N^=t#Br(L1)@izS1ME?BidwMsy ze2lqjjr)6ytSuJ9eTMBvjcvNklCpd=NlnM~!B`I)oV{C#ySAR*M@yh zyk_A1S;B1>&#wQ`TCB(+WgS|GY^iqGWFY?rv&zs6^EH|IK{`YfRikxf8uptlPd7_(fm1El{ z(P-NhV^=S44Vp8P|KvLczNaQrFF;tHV$R)vHeK|zv>fHMHF9zsbrD_8H%#7Gh1c27 z9!3?F)zQ9vcj;{wpi5yt2@eK=+K=ovQKIk;F;WTaCr#JKiu8fZ2b7%o=n21 z`$XoMtGpx%aa`^8zWLtDm zaE}{sAu+gJ{c!G_C8xd#KFnZL!WpP~X>zq;Q*Z8e>>w&rhMgX7b_Ol-KcuWWX!J>r zoqzMn-b;F%2J!~6_EMIqtZFi})~P+Fwut!7WrF>kI!6^l+|lBb>BCWD2K!4W4h-M7 zhG_gwX!@lJ9h#_Y`fxdqnH7f8)|K|MuJdQxoW&-Z+~9U!fPLzeGxYo9uq

RAX`G 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 G{J#J;4{eM9 literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s1_massing_rect.png b/examples/pcg_facade_tower/verify/renders/s1_massing_rect.png new file mode 100644 index 0000000000000000000000000000000000000000..ecad0a7645556bb1b14d0848ce1fa13f4e4d4510 GIT binary patch literal 52243 zcmeFZcQl;g*ETw7h!P?M5k#T|LDV2fln7BGjBfN^qj#c)1VIp^i;Nh(M;$d<)WIl0 z^xlF|MmhK7_kQQBZ=FBRTHkutI_s?S-G5lm!raf^``LTn`?~giCgQblLx%&m!1*C7yh z^8z}^@VwonCbpMx>L>~xZXt6+wiM_ueKwu^PH9Y3B~2`c3j|`M)d9cMR6BfdP6n|} zBtfi_Uo{I*dppS^&-8YM(a&2FH)oryWYK(DQ=?&zD0-pB@+igrh%HRP^cnR?c z5e|zafUKXt`NV=2WK|$uN;-<1VDf9rT26PLYxKE6EzJ^_r^L25N|>RX%0FNC_LdFO z_C9qFt3=wXj?gT+C9&!zG%@5^&rcu+fCE; zuQmQ2`6gg|4ZfnsvI)BeO8GC(F1yLi$^WFVq(fN5h+R#HwspI@LWU+&Y}**v_J z$ZPOf;U~Y_$Y{G;Lu1K1enJRD_cGA5>hkj|CHa#jTf6mWmEV>NubHnaqv4)_3S4GxhNm9&cVvvXPK|3wi;$x2!yYA}@A&h_ z_nse|%Zu+%Rrl}6m@Q($NPqwu;Nv^=C2fT6-)iO2uHLM~8-A=?KXxPMf_x3$r%rK| zJ|Ip_eMpW(4p*D{in!0k_oKw#c7GgdIdx^Lys~u*0y!lB-h66tm8_{q>(KKkYdOt- z4(47g`vOf3jjgu5->S(^Dig;dmuR~_*N^&(ZN2a+;z?f_%93f?Hmo&CrZ^Bcx(o?? z0emcw3z#DD0uf>j?`x!-^4=Ho8h%WZ<^flYEf0HmJ?ndSbjt9Mlkft~%*TecC6tEd zNQEOBAv0MO_t4e$4y&mN@UT0;!<@*UUm3_wM$9n14w4Hk6ld}oHm;s>lCxIxAEmJF zef>E~oicxk2O&G++gDDx*uyjz*Q=&@kw8qE){mY=6SK~)7XuPQq!ho0VQ>`prsQCdMj68 zoeiR^WY0+SdA=Z4cfI#|>h@PgwsUSpH~vXQ2T6)13$eDsdwxtqQ|B&Q%VQN??IuSB zLmg-j=9w=+p3UR^tAp7JqD#ePvg7G{Y<~Q0Gg|!Q`=sNki_Tkrey%y|d@Ymk^m)fd zEfd1&#}LSvJN}+ez&(4s)TPxHjQk^JyQGYVS6t3_>S9~NzaXeytss$hPhy(|H#rGJ zvI)Iefuub6(7XZh2pCaNbhx90*E*Xcu@80jAyg=9br1vQ{FSqQ`GWz>tn1V*Csw{L7{b8CgOiX z3l;9JB!FP6F#^U|eqaTGznwDuo?}|qH`On`H$21OBD?-Ku2xo)XjW}R*@30>8$skF z!dn}7`CNc}&mI5+!s+urJ@4XLfBkyGBBKHO^l(4^aK_fkUit$&e;M~=ioEd0TN_PT z=eJTiZ&sB#2Ejn8hTj6Y<<4~=O9Q)J69s`NeXL=l$_Y(~iJ?%P$CowR_Vguq6e4OT6B8on^nP zCK=lc#XpK+JL99JYPAk;M11Vb5nzOlxXDnKX=Di52^x+~H(pmR7w)8z_C4PG!R1(+ zUxq~Zr3f=jRtYI*(TAZ=SO3a@jE}km3>x(TeI;}J6SZ6QbDYmp8-G}%11;fZ^`Rti z*#Sq74BpqY*wJsKQ*7caUBr+A(x&r_vzgk8WYm}kbK#lON?2Cs=<6biAdqJ=z|jPGf(SClUu#sVXGqj}*nRD` z5X?9R?n%#{7_j@#w}NK}F(NeXg=D_HDG2Gc8!Yj`xYv1D z$9LHvD4?;m-7lx&5}?U;qfA86cZEG;U{g5krns*Ys^v73M^>22wRPA{23lA}oLg;j z<{ai0OaL4KE#Y3=<}uGEi5-5$6mYH_?ryJ_koZ!Xe*<=13#4;MNifKb13$hDLIed6 z5BbOSg>$>g^fjq?c)KPG)ook(5}~pdN*UN)OGAR-W=(Te`MbVHPdSA7C7L4YaRin<;nwz@tV#rkv>cS^aicL|PO$p>}4>nmrN@sg|Q>KfctOyDqS@tx7j#6{*{f(;3~ zKZEj&H;GO@?43%#FJN{SwdD?iF8xt@`>6nSU4aN1M~XhJp5jtd(?Qo3RNUk3=Tpj! zZ!ysLzjOpKZ&7b$bp+*lSdteh)Hui|XRd5t!K0&gOV5CT>mkpL(980S-UHJb6*{SH&)*{627?x$I@3nxh~H%jm#OSNqAYX^;3Myr++J9WuU4M z80@p?#=Wa#5Xi>8|KV!i9^F|JjiOdb4wi>H!+8{(-MAZT#cGYZIF&`Dvj);15Rk9V zh{X3cVzJ@W3DClxZg>6Swv+GZz$l?fKhFs z3;mS2)fn=Q+FPdVR&j?3B zT?YQ8fG*HN(HOg~s&TdiCEeqWIW&BE0$><*pjH_Dyy|KSBxvjzXC)7 zl||;Ydq5NcPYt1@o=3VBg0%ZHzMItHj6aHt=<~U_pmIWF<@cmgUn0)WGAyT$|IEJ> zoX9emJatN^K&U*zTay-8ljPX|#K>}3f=8!OKdvn~fY$GKYM3{d}KCq z?T88S^lUDFCMs>9$Zg#rO-y|6+wo7J(JP=)1ub49=_%8K{;j$+ueBAw7dK*lnnZXG zeJ&^_ID1#?dAdc&biUE!*xGC~18dNL3Mr%cNFy8p+NmP|67+!FW<)qDab9L+eQyP| zy4G_;v}r5h`*#hEcD|4GPTFb7WcQy&n_qeluL4UD081euf(w=BOZ>+#+wmmaYiE6xipLa zdN)|6xeu+f#}E?)<#Qo5FmkkI)W2$ou$Q5?KARfYDQ(uuB`T0oXeIeYY&>Xynm-ErXqNonr zbsOqBotCwPFMPY9TGOe5ZZ9}!HwG*7G4q3N4W%&*kigp^LRSLWf`D z+of&!i`kr8Em=nP2GT@be7*Hfuhl*mH!|R=10;2CMOE20I26m?@+5*lDnN392tEh6 z=~ki7zGuDHqQQjg%1PZ5iQ!Z^INd~Xq=xflZ%G$1* zDZGJxE6KD17?QUUyR={}AoI>BhG$<90{J71H!CMFYecE)Jc+K`FJ60b&p(0lF;88` zGW{!eW%-kx!=A$tR=*yS+4`_17HL1WdN#9OTyHiIDB)@l(`ND}7#5*5?R(gcnO6BG zkTzMphdceZwdDWU`g$zOEIG}!4->9ywUbP$QeN9PgWX!cBO^G<=61C&Ds5_)_K>h* zI9f3Ghfyx|6Ty`P?ac#ZZU+C_@Lx(&`O_&1^i*Bubrmns9{hZ z9#ULAV=>agS+v!uvGyx}INoe@qNm-j`gtGmRCu$RxW#dMY1G_9S^XxDH}pN*e28Af z#|I&RyqT+bly_A@vv%t-zh!5kUcz0Uqj!0(Ki3a9k#W5Xf-*FSyz8?EC+FThl`~N( zg0|SyT>+ZT7LIOmR|mb@#7AfThQdi`GBji5ip|_Wrk07(MI+|?xaIj7&Kk}bF`_8l zS$21a&^9|(YsUKmL|K*=pdlEdfUhEAnzx_D-|JG`&LX5*2+g-KiOUX?X$DAUYsT_$ zy1{!PRJ!awySlXjMj6fB*{_OtGZNcbZR-D?J#L;|<+is<>__23#mGIGtUy%}rQXJc z+w@#Y=zZ^DuUDK)y!ji$RlVLQiZvfr&iwoa*g;7!_TudOy!7mA1B0~6;t=DIR%WPL zR?c5*$vsSiLni=AcqyQ4ez;x7Oi9{*_wqcB# zCPT|+n=5NQj70${|L|8o(_!mp5UL*Cr1@Ie1vzc&yDJVIm$*UgW7G?%H7j?3G1#8R zB}|2HpbneT8KIigthuYwaW*Eq0O=cQYJ5SwZkRsz^LE>wsPRcs@$=YDrXe;LdX&=B z9k-zdMa^hIZz<%WXQI;tefs+MXn2S{p)n@zwlfp!2O&X{$^wE0)wjY8AB0B{lEvk4 zcEe#2{(dTSZW~SKenQIq7A|otU1d}|gf`iOF_O5yiz3s?xdIH6)g*w>pbblS{sUKm zudAEj?|>~g_`Y7U(p5tL8q3{}<9kKYy4Zd!QCBhOX6hwpHrNt6&!&VuK5Lf?eGpD| zw?cj;BIDjSC8# zVGrrFh6_kJx85c+-)y90EItX3S9!AN(Ge!yTM}0C#po$mqp?C#urk zAickl5F+BawRMoy>Ct(tHdTA(8XEY&)%b$ zkv>JZF=*K~aEVn;Zq|t-R!Q{hT@aT2%Ml~(mgi5FmybUravNaxPLG+3Hx9kTt9Zzc z8ZKo30L2-}@3Fgf+`}neZM(etojO6YxNZ7D*x72f3pm^6+>1jPo^=8n0FU=N?ma~G zeK9{&r1Ft~VSHFe{}sChbofH=2B11zgTum7yP`*Zugcw)rbXybM`+2dCl(<4EL>n2 z#fBMEK4VeTKKrZGH?D<#ip#5D(YeB~i42i-Q(nMbkI(HteLI`oo)suhtD90bC;aW& z2Q4`eN1R-o`t^3lff6UFr*)~VP_)3}|=>gk!m2Fi6Q8vywr zB|M{~pngQefTM^J08^FL;P@w5{f{3)W?3Kj+=3h1|Z$g?2ExjIGQ^6JL|r zmDPV4XH5$$)`E_#3Rt2}m&9+eDR2JHl7Vq-Y&BA*fFc*tqBnMr@bmmjqk454Q*FmNWhR4(~{gE$>m&P+RcRP4T7i6K3>l8K}qinW4`8eeWl4 zU~)13K2Zfld5@LUzl@fI)jNG>yK{yyRSh^h8+*++TvY$N{0cTP>OP5D_o`+2FmnZD#0w_> zx#VIL6U~jViO)&-$Thp*ac$JY?|9Zp;-3pEGl4yO%#xlwF~0%$0+;D#4ld#(n&pEP z?X6!i`cDGRzwF-f^AAvae$I^Be$?}q-O&G5)M%9>`sZo_ABKt_fRNiCKo1B5_^U^T zXKbHEb4#TY&E&SGv!F@t=Az1mnm4=5%8DBg9E5X|5~w`Z_igdq!Pqz8Ab*GfFOcNZ z)3S=}Gy`euVcBq{eFWy~N&WP-9xlCv&qU0wt(lQ{$Up}SfC9j(lEK6MbKx!U4XqxrWQ6)oPoES>1fBtg0$6hMW4OPQP+a5rEz3E@ec z|9$b_VuU~d5AjP-0?*;$*MB=D^#A^bRwqhbqhsNC7kvVNPCNjPnR)TlBNd_-EN_9z z_&okG^U^c4IXtXmezgMUWcYmDNkLENptGz(W$sxrfSmY5_t?gi2?DW8Wl^ZLxEkCn zpej)+MyXd~)m1PqRR}8;jQ_~`H9?v-tO#RRCg}$@uDb(nrw&kJ<|>G_l%5+KlXc&} zXI545=<12MEvZWNC5tRCX9y(kml@t(N&b--P5%?#2ISm;gVRo#7|=*b#$p+v; zK{ZBb@1k?*#19HYHb-rdZ7pNeNOxHQvK!V)NKQYj+GDP%rBS&$gc1CRr2epy1yrR0 zkmx@j7LDYlN7T5s6Qc#ArRFG#J52AqI9p1Lv~S6=2CYQ2PWkfZ+cflHKQ&&0+WtA- zkP*O;>c+&(ui~;fDtBwGxJSRagwMx3aWz6oR=T+%tnY*|_c;4Mxf?Yic`#&a8t{dZ zn80Iw0-Bhkm|qGgoefUB?stLi2dv~USgu)RvL-s#*t1OpOtbA z{g#7^8|e+{W2$YZ#H3Q$Lk24JO_{*>z*ye@xy75qA9jn1Kzzy5%qv(rHSO1*Ub1Z} zbFo6zsO3OEI2BMHc7S;S+-|M=3Wq|RF>RFJA7F%BfE)x#K&pYioHDgf>f4MFpZoLt z4EsF_^X<(;W+fd>>E>sGnuq(Ziet`sdz%!&F#q?E?&&I;O;(lJ?huk;T#<~rZ%|`b$^>F(=j?p+{ znsgrBSy$)rM(KRLaOJ#F6@}328j(GLRv_2l3s`^PUWlbN~Y0YK6 z(=3*~pQbYTFnD3_IIe5Kl(*rr!`x>lzOj5gk&*ewfKmE*d-v!P#0jVlL@&qp1N0Gj z9E#8LqrKYgUy#y!Ppp^{|7}fH;$c*+`1tv`8kGSisZjr6*W7RPix^t5XPBt9mm0C= zQ+zV-0t-5&l+w?KKNPd7C%YHwmE%2zzT+Pfu>%!@cyOvRgT34w94|y`i z0g>F*%H7YHuia(b;~UQ5OVw`^ta-zz*7JwQt_F@9ri75p>&E|J+9kZLngx|X#Wz!HtCJEf&ro{- zlOd$KO^ra))m?q&&hyo}7O{S9)<^{{IOXL2)r!&lM%;qhi0A!M-x1`rL|vNCL_~uR zcED}QKX6oL2j@4aJtc4GyLZlRXi+|X!+wI`)E_M->Tt>H<3$re}ETM;G&k7K#)KSM5c9!IlN@ra9)tNYMfBSyY=$vG@d zbZpy6u-!2+n*)w0EGW{XTK)3ihS*ZcmEiMdPm?Qz`}v~&Ou!;?4ZR;|(m0}#-1xNP z6ecM=7=9Hr*#9rh8F(~a57oMCYYW=k`PpKa=q-`{tjSPAJ9AZ6I7Pr!!jcvi$B z8@@$CLQL6ZW^kXGMImu9`}EWr|1?$sPAy^(KdFb|gLn)K?SOoo_%8F(*sOhGbNzi| zTEDt#y+*s$&#UEs|L$FuocVOgXMby?(6YK{_VvrSZ?0mdv@cN8by2iKQt2<{Y;8MK zQ`29v<|<#PQNlStjDC}Azm}CbV@dmBUPKeHK4T4*)#a-6BX!FTwMCfGc2ayd<%a8m9Ur!)j;kNt^Hzw88KD!E615$w@s<_~zr{A;_pP=(t zlM^4Gozq3oY5lXN48?D0RYA|1ctZdqcKXzD5Dd-qrJlv}DaY7-rlI*vU2I>_x%5lO zo@g>d6ih-KeBVpd_+_X$o@bx(=v>#yn-zKgrd%wR@$tgS3G8~8SX^ZTr9iq)wN}g4 z`4}L(iz7#hv<2&Ij-{8c&ph|I3TcXN{TCx~AYqG3T3Jn2`c+HHcvl^GOGp#NAQuE} z^F!eivT|;laZu=Z>ehibZhvF?n>wzKVe(*YT8Nf(!C6-mji>HLmJdc{O;+ue!n*{P z9-W%cW*esdjO?@Tsb^H>GuoWWT>Xh9lN{^LG=9)PiDFvZSJXb_Qi$YUUJL~ZIKw}k ziS(*sWTc05@l{YtXI}eH=25UpgSb;JpUw#ODhXRUnmtq`X)TQW>%Kiv#g_Pfm`#)0 zP}pliskmQD`;(N}vzf*QZ`bu9HBD%7hs~QEz@Ei;pQ?rDyjgw8E$ly6;mI%LGP+Ug z`E)^jvWn9Ns!y@w6Y|MfwAZPjG~2ki&0(tVyp_Yp@VY6W3ms=J_Ivb&F^$Uf|I)mV zp_`5X#A+G@_)lF4B4vRPK63@mheQc9%hulcsR-Wuj~4vn{U9-?Jif)EGhV2dD=Fba zx;B$ra*tQ)uKOJ>;=g~R#s3;9yxe_o1DU}jI@@9R_Y~Q`ygF9fw!KH-JN=P9ikj>& z;S=@hmsawpCj(c4-wELqiHr$OL96}qYJdGc8xEhA@8cPahq~;6X~SZVE40L8C3WE|7cryR^UUx7&)}#X1ih-jImkS}exbf7b0^#n+mj8fL`mmaMev?h@$EKQ1+vJ7f zQbWsoZ6(^* zweV(@#PKKnBN)>FzZ7Tz0^CY>t^eFb#Wa+=EAn@PUw)sxqLMl?FG@=TPTlA z&r{an__KH1P?HK>G}6v%z3t5!Ew&%1e4scihEuF41x!Gr+GkMf05NWd0WpRgb)Fbd z1JVJ${wt>7Re^q~@6Upa>9eB`f&C(8Ml;hAJ{zNjulQ(7eu}WfUGfQB*p+8URW#2A zT58x#>@%@u<&{|(=xXRw5T6t>aHSTJF^6z>A(5JzTA*z4>k~6q29r_g6misER14vV z{*%>URTSL*P|+fPPQ;0LyftvO5mFd`fnOA^` z0Uf&ClloaBtA1nPR!uw1SBU@a0jh>GVaP3i^d9XF3G>=qM8@(X_%Zr-a(MtHVl_5O zv;BBem%86jw>0Oz=9^C_6F0ejMuQm1{XlR|t=Go(E}7|2O8>>x57yQ?cAW3bS{j4t?t(_NVeBlRnFx!F!q|RExPBEYd zNYV2Lo=~@;{bW^eVuTdJu2(bmIJN<<=6}9DH=aUkU|~_{EGy`A);MA!)yrr!OoLFgPdoA&If1zq2eZ+p}dt zt7R?c)1na{MSh_VHldnLB`ucbMgo;^3m~UD{%`l*2o5`-=h{#q#B+?XJ*z#OUz3&G zXUj$yW3&LLTkE!kF2`k_`vDJK|HpKH2YEsH+YlU~6aGk+gI4LAI+Gu^7c=kwJwK}Y zkt6jEAzT_np*Fy;x}fVT4jPO`xz^H_B+q)v<7vp~xm-SJ0H$yyOot%~&lDCFb(yxXs%WaP{4n8bF9`g+rZ1qAC_)SBPxgu2EbDsPhUBJ zI@+CDZ`!O*xYT!iC_){PL`~zdIiOaSD<_Oq11K>K-=Ua!4=RL&4=kZepG9B3QF#8{ zO~GGG@5Dfb{OV~L_p<90d<*R8{%?eY5KkXfEj=P(7MvO&TW>Y)jkDV@1@Ksz5Zq8N zMuhv4Hp?oePYDE~GH9_HefY1Dg+SZ?l?%v!aYihxf4`{KXJ2>->SWv*rc z*T%0OAc_AkT)c4G1`~W>H6<#WHUJm(^=-(ssj7}bkYuHeQ?xIu(C15)j9;pfg3 zbJ3P*ZkmF3{N^Iq0XEkA?dA2s=NTZduEUs5qx?V^Wp>4~D4;9!92?wzeJORU-wosT zahu}Oy^SAb_;X^L&(^jny(0a)9-DyzCxaRlb4by8nDGvN4rKk4`8eOl`Dk&68NWk` zqdzkBFjXFp28u|EYKI>dR*iT!Y?6yhf^eE98ES* z7w7VK-^y|(cppxA zKhlIzFfvC|-?z#=CLH6fL@g1;v6z?Zpk@Nr3#+R($SN*DnhVG{sC4>ZvMpE|P7xf^Ij(%mhh(thJm(OQ!U2Q#)h<&nA1)Bx;#Yv_vJ1w5alo5ACEY?qmI)+YfExFr){M?RWe zjH|zw30bkSBtte>Jn7u}VRwCbbwdnr;9Q{1q#k-yM`1bPqesllMzUK#5x;SXOmw}c z%CNZg=}V9nr-WM1q*KjfqG6W31D9*r{~7e{;HTSja&@LH$(N3UDEbBKKXLa&W*m~$|9$Me3@+?oOSs0zUQT5kr+E|rp<{_jv0*O4}wa?CT zhS`&gE_@pND!*RqKddGXEc*5!1H6G?HBC)c#!VkqI_>kYkA3~Z8oq=m;_52PqDLIB zhgN$Q79Mj}O-Bc?9m6hJsR$~^vvdjeA`IC+b(w9|@AbKg`Sm=iPW71fI&A?K>XiZ_ zf%z2U3j0a_HW)53p<0FQmHIFVO*Y#h0krvt4;6Gk((Dkql+xuJSBSKb;q51IQNz#;L88>0ja|P{-SGj0i9`@f$ zd&f^<8GB#jl-Tr9eh{b7TRb7Hv*rDgxU6u-wSlZw<8TJ-LcFSQZ!U(9R8Fn&3_Ho& zcr^Dd33f-+d7(h3eDu{Zcqnk4fj=4(ugZLnp(5#CTXOB+zJazKX5WnevGImS^^EVq zX^o4SjB!@#_;iS*~(aW?dKlviTeG7R1r&T9!gvq?R+p} z1+jX=qR?$oZkgeS#TW+oEhcEGB=djkQh5fP1LKy_kI7Zd=;DYw|orv@okXc9dH zo-)JX`QFdTEz&UQ-P&4hL0vt1wBTlDYqT$Rd?mLgQnob;;t0!Ub0EvQ*FxoH>+6N&t#e7k@A~h{ zB^f^Ia>hlc-F}oBa3N7mU)#8N3saabyR-f)sE}T-Bss;N@BG=s+grD));LpseB|aj zz6Q8GxodKAjKv;xOy?F`5)?#ZGsoHW^{0h?FCiu9WIW9#oZ`2ZmkSFxI{>PMGkSwj z=%0#oYldIUajdd1T+)eQ{jAf`0Wb(i%^gwnhli+(DM4idkgNhN?h0~5n!uNs z^;fL%v2f%wzN2MZNB_UaB9X5YH$^5eca_d61(ovy4iWZsSdXd0Vmr16A@7HWPgh&Y z?+cBnthOPd-Fu($=Kg4bh1=UaT-vx*g$>f=3eV=ChiNBLLl3?qJ8JTTXr@ne)sUEcI27EeqNY$XIzf$giun(MSJeW`h;I~fCSbK z!&uio?}lS=dI_!`eG#c{>~C2=;4vsWT4iT^16Acn#Wc!vWIe!66l!H?@T=*Ro`B}~ zD>llc)I-8tB9pTQ&JE_vaojTp)!`GB+q4nGR8+SOE|$^DztU@tvq!_OGz4XpWUa5d z+O)n+=(|}o&aMRYgJoF5^E8HP=DcZyNvHTmYdVZTTY+U=EASvmi>iHjuejkM7tgrW zmCcEF@X>3&{;2z0@WdXA@&iImCNn@gwej3o-brO9NmlZ1{W|rlwb-z5RH_4E-P`xc zT$GkHxkZUpqXVLK(t;LNwN88!{j$igNbBZireB<-BAW(tbdmIv46M zt&L^~^@P43m;QWx_NGZCMg9iO73Mbm6z(1uJMoJrAj9aB+(~uOD#lD!>czNnQup-- zY!_mteQ-iLiIyrEe-}(I>UXQ^9ta7YKg$I1r84j*mD%TMI>;@&PxmrTQi!hx=cd1% zhGJ&c4hc023!eB7Kb-O1UA5(vsxx-K*HeaA{b2+-G5ks3%=berq{ZjlSwqa5#g= z+QOwP;Z>ZDh3hAOzkTS4I>sJorR&xBj(c-yEoYoR`{VKT!l{Wl++%a}0WGQA*I3bV zOaJ|I@eKd{Y50SR?Yhj8m0@)M!BPFV>&f_qWEG~7Fx`FB3%miQK~-sTfP8D(=(UB4 zDbg?f?IoKMa1@!nhH5mnkl-1amskoJv`qCgp2RXJq4i7cRxyVDe_I4D@}lJEtIov; zHx5psrFIVq8QjgPx9UQrXSKP-Jo;iX{7##3j;O7V9B8)&+iFI6CMoZ+_YFg)iiXIC7ns^qbmX@bBL_4rVV!|So^vik2)M7vcK zTp>inyC^c^QIG-1UFa7B!Gjkz_d$-c=3h4CCwqX(Y@T8Estt_w+QaY9d$#D1GgS%F!3@*dAQy3Vly-jzc?9oz7!n~YKH zZ}+-mgsctmE5*j+zi8aKbI;O@tuxz$t3mGqBu{?rvPVaEsMjJ$jIk@@xc6UUP}oS4 zY5%julb?hrDJS&iVY>HEQU8E@2`W14Pt_~72j0$HA(vQ>p}D{{`!InayA#%_*pBEE zbVi@5Mfo`3qhYo9JV7U?~u?2+zv&I&p?X-cBxjeg-OI0n}-x@DMW zhq9J<)<>6xvI5#LNuz;JK8(HvGl9+Hc0VT$pT~9UR&JHcU#PKXUH7DdMw-w9H$Ud?;Eg^TORCb9w!mymc6g3+WCI< zN}UqSD2OI2ovyCYPgbsHdJgLgThe;h-C#HrU&%C$W;*K-c)_bzs~u;C)-O-)WIQ9B z+G~1ng@7FGT%*s!r9-Gco$GjU>qUn5L~=m=Eb==r0lHDMR_)zWfdlBD@-*61OICbe!C5SU zlY_fK^xze>VW!=0wWO8GVelhmVQIl&ks@&g7)ljWD8IJrX)^fo`SaOU)ke>j z2$VQL)#WY$8NjvSQKAV%(MN0iv=ZmuC&_+F|HMzFA~ z%w**6n(Tf5omu&Zkp+ttcEan2go2N>N^RUa`limY{p^?DWu|4=ZOwXY4cXi4E<81O zU@-`g2ojJc^i{vU~Vvy@H z<7bRv&t1$G67t#h7$9-<9V?VqT^4qMk66FCnCf3rvZQSry{NyW_f--tsO+B6Jo=bk zNz$or+t1x4sK%nRuP=Zxt){t;#IlBhBy@$P&B0ww=Gpr`>0iH3np*&ga#m&z`q1OX zpZWxwX)?T|wI4tdl-T@M6EFcg?LQ{Bk2`iG4t0Ez9~BR!+FVwMoA#go=GwhBO&%6> zMnGDG3KaVC{7W2*!&%Ra$MzI&ib_7xdy|@m+px-vq_8~BjCORT`D?UPsc<4uSc_C| z`f-PV%4ts_W_g(g$*8)_V}C>R)XMTt%e5qZua=c~ts;GD;>AaLWk(2bX4vnmEvIAa z!kOwjyzj+nK%ri<=2{Hk5KwWw&o#>TGNvQn8osvcyWcz+P`7?txx6n!Reb#v-FGs- z2F(x78i+K1H0cMc^4sBie>pX^HeCL^OEUB`^-BtuAQ>_pvHddFk&M3Z z?Gnw6l3WAQ<`*GJ!&(Pl_JRQ3D!*vf^a$>+ZVxXmAiJZ4el4-K|1kdCx2q;MMsh8T zix*j-%|IM(i$uQIYMAM4z`8Z+fQs}`YCog?^t5(D+uwhd{le$4Oe)=fB0~QBIL?JV zno0e&HZa0?sS5_j=&J;k=t<=9-|CWI?n~Z0IAKvJih5z_wUt*53m7aav`Vce9&CAn zdd8xlhfjiN>jznBCGwrN}80)gq-;W@!MJo49VLM6cQoKqy`%s!dJcQ z_XpM9lY~AQlq{lTP9%CfdhV;C-JxOF2e368X!%(Th-Iy7K5qHqi1OZX45(T9IT;sW z#!dOq7V1A8nshPy(S`jZ?mS)G0i5BHdjv;Ij@_a&=f}BBrlnQ`cWgLxt3lQIVf0vr zGhxEC=?`=3VL@Tk@#(qG){oW6V#&$5qNTn!zt#_^Z&RDQjAv(O_e&lBN#T_`Tk28O zD%8K(*P~A5wp7t2{a)C9GUK4*Lw2k-4A#7%gYG|Wy`HaGveoB=5*ch@b}wzm*bY~xjo)v7Xt$Wj?`+W^WOrhlJ4U} z?Y53ay>smQD(Tc2o5!x9sqNCtcERVcn;iqq$A(xHjAW#X-V%ncj?iYKQmOd{#8ziR2sg2O(dc7~7e* zud%25^_H9{`d$gYaj})cOWOKmb7RlvU`wyY+s#;Qx0QU_Wya9qZM1uL&h>57*$J@z z(f4@O{Jf&OrI$0=tNny&t{wn zFLMRP?d*Gz2_yl-LO%nH%FXIRveGDMCRs_tD6E;Cu?oHu{);Pi9^Au*KN_*d;csCj zq|C%2V_NU8gj$)>Xq#=mh)`tqo``*E9^6U@UJ=BPp?n$q6B0!J+XV-rlehMCjj`?k zpu$+VjY1q&;?JMw!QqDP&8ry!f3pfWmNY-+DzeS3YH(6@g8_LaqVtn$U800l-gFw! zD7pKNjaZY`8uAp$r|bQ$Vg{AoZYjc>Ut?Du=BC}s%RAl=*!DY`P9fv1nRypp;V{K> zC+a&Ad_6;vUZry=W*sf)6BJ0n)Np}S;3B`Vyr?rCSt9I8)nYwP!5EW^K%8{RpEE1O z^)IXDs^c~SUU#S%tgV^&2kg{x@f4`i-33SdkHex1pPkrT%7|J}nfz@;{f_G~k9msq z03(u_nLFqhDXTC1PaIIYNKhGMzN+5x@;WAD^gRMjHb-@DrB>}V#rcenqo!s7cnwBn ziQnOu2yl|2A_I8?5yfs@oqijB9cU?1ImJE2>quoFbKTqDzgd181+>dUHE*MiosY}D znJ*S9w{mlFRUeY=GI;&kri_sFf8KmlIx~Hkq?cMlt;zmAd%<};rMSU&U|_azvI0$Z z)@dr=aEP^))>i$zcNS+h?&XkY-sHIavGD^tWrUKjW<#09$eic!gbmHuCV_B6;*OoRXO{lZDerNb%I$-b1ysFsJ(O__R)N80}4uXxB z_adE;Q4~ASpv7%iD?J&Iw$!U|~qca_-ZD>Aadpj$Dw*5WDwZ=msrNC9@ESVaLkw}Df0}dN+Hom;~ z=*z`k&UMp*(#th=XOCXR37QXu9C*J-WxEW8CUL{4KC~;LU9qoMM2t#0Y-~Qw?@q`> zKe0evAvY-3Yl9m)>4GDDw^mFiak9c5(`edZ#WGar(+_I49{-GfkMRVNqq9r4+3(K6 zP$PNy)}qUsItpu3)u>8o_r9@BH8@D$u?077eh`Xj7Ua?_S{csEH(v2a%`mQf!mR{* zU?(i+$x+78_bdwVqKm&hL17|ax^h4QoJJVx&ja>TFZu=3PtyARo zXVKH8+Mtt(kSgiB585c|vYYQ*VQC{}maGWA!L?UOC^)=Lsx)&IVt2;tgAaL&O97<-AP+lYJ6sbf?6sV z9vA3ZS87idpe<2Sd~aLEG6LXkyNj67VU0AWx$Rt~yB9MZOcN%DA?hx>;L2vQab9N` z#-i}%DIo=uAgfvuHAR#XsQB5Lc1j@=#w_ePVuolr?_^JhH&M0mclt^xw7_ zS8hB#a%vUC)Nm;P1II;#WPfjG{f3ow^|R;6{DxK#-_;h_Xc8o~bs-#wPZ?>!wEGLs zcEs&AW~H2Q%33=9i7?p61~J4IRXY9{-N0`G8S|kvQ~lREkB)Wu)zg3&?-`UH$z> zPEpaQVDBDp&Hl1zd3wOwu09WYPh=uGC~E-DtVd>HKfc{iESlo(;M6cbGi;FJt`N$= zcY1Q+*z$HryU(`i{*zjRpEz*dor7KMh}?;+jwx*RqsxhKB&fbg;YNN%JN9B*7N7E z0^wcf5QOc!KX7Z31NN_)uTV&0T#hb=thGeA?&-pg>5H_}aBc28L}9mi_4$s&cgeQ< z1Obzsq{!-6e-bAmb*h+HXh5^&w^Mp6M)DqI-nj3TQ1$P;AxEe2ukU+iI6 z{yM?D%O64qRLJ;OCPv6Vo}DVufHA3{;S0S2%}3q7nnzd!;DPrmhm zIq1gc!RW+*Hnk4JfF9+9gk2|&({MF;-{a%|gT42TYVz&c1yO&3N)e?A2uQC2(mM)* zAYBYa2)&06p%+m^1Q7wH7b#Lg@101O-a`ig0j0Nu5(4K&-}%ltv(B11GwWSzzP0Ad z9~en^p6A|o+xOnrzOGIkX{2p;*l;%Vt>MM#5|N)QYK3ZIH%F7$yg(JXRUPBbV$`MA z!2}xNS5q4alW(RERXb=DVo#ck5i$Y_rF+%WJ?7AX_*i{`kH za_oq0y#fGjlO}hEr?(!?Sf9TZMenF28xgfmBqj-M5a?+`g)JA4Kz~z&E2@j_j_Rfc z+VyM577-h>Ku0i>=RaPPNHbAJ#D0qXfICZ4?Vzr1W}+?{mCiOB%hx&Ii%~58$8dm# zh%vSJJfZwt-}I*W=`j7r!Ojn~AyYVVhs_(o>K=`+1!qi4p|kw`TP1oWkIWTbfBRO# z&5kMcWt}SC3;{5}jw#$N;&nPaylGI@SmGUKR@u5<*OV9YOOb>o`3emdCn_wgn;m^! zKf0)4p(-(P?bt1lmxs6RXbsK7KR^}td4n;$woGRk1W!{D2=C+LO-Xke zDSM0JS!~wGZ+8KG9iy|c)wHIgnLw8Oc~jh;Hq7{ne!$u9&L`mb=z^52tt;CL9?DTq z6BN>l#tVnz1EVuBE%4+)QXdCmsvcB)pKUG}HDavpvJFGrD|(>>lC?~7H}Gxso`9O@jLjfTZG+LAnS~Lpr)<$ z^EHVirZ_Ng0w6j&$s!&bd7tGK)|r}U%XS<*HCg2!kGPXO&S1MKt1YKmCTmnu{q+}5 zTdD_Cp53=iE)R+wG!C7=UOGcU!!{wQ(_8vhq6oWQSxow5I`7R0x0b^yVcJ9jK33=Q zHz&Z@bU*Cp!DfA6YrlRuMVEsm1glO$QxHMVYCCgitU)8|QH&!gKotC%&6(%k_M^$m zyYY{_LOW|^DLCUd56I$<&LoRPdqINH9{6%wxX#RI7VfZubw#d(_X?Sa@eu_4_~ugQ z+3}*A!0!t9+PbQ!{r9tK7Uk+WXUp>-`R?h82!+h?S-;f-PO==;#2=%4LQ+aO%s;|4 zWRr1Ai<)A0-^Gv5xOalsBsUKiy_EZ72cZ{p*{AD#vT)whxas0;SsR;2k4%}2JliWp z8L;&+)_w5^AE_(o>vwN)Egg3(3-lrYM85BXahw8Rm#0ywhlN$F?>qY_V=4tbB z>N)4z{Yc!|f!k^yjx(tbGt;O6MlKuKZc9rBqPsg#)+^HVR~b*>X|rT;)6Rjdby~Td zW&1}{X5)bMC4Ir1!WXp}H8mDLKAM6sj6j0@Z1zSob}LB+9xc7AHNR7|J{H(@Jal{- zbKZC6qRer3>R0Re3itW~cUYOQ=&wEcwM(*>0?zvVRu1)YRPz!~~xj@p@N z``*`-diQNvXJ_8H9?No8R#s7C&-R%#>wNl1tL@IxgnB&Gd0yt$tq99TkE@N3OkeGf zrENxPZ1|;DlU@m)XiZ(ww0cV*y&3)X%H}oGbm$5{DzW~aevCuGadcqCTNxUU;to|` zqUDXs!xD-muokSF_r1)12!X8r?D0PL#j1N-z*tSx&~ZPLO>>c!D+e7;^D@RVYq^=j zzYnO4{aj9d=V+uzz)=PI22))wIX7Rscas$%_cE-Fyo;X<7!4`43H4<}3yknD!r>rB zv^zCHtZV#?He5oZIs>HPGG7?TKJ5yIlA8pwp9Z9TzC8L|_V`z8AQFqR$?EXFk!2Bk| z<+Bo;v|!SjtLw{nv(Jb8@m@&{fN{E(UBfbR>DzrCV}gVWYU3qrTUb|9ea>6Y?{o7N z=SRTThC#|HRqpl+-Z)jZy&E@l3iVuu#F57QfkiPnO4087m2tiesbm^5(ow2j4RfZ< z7#;F;$vY_9bKapOCK7h|w+_*<1`RZtRu0r5~6XR5*fO?SJ24--!eqN@QCA=-F z6sEM^Vovilrnh0 zFE7XQUU=nw5rNzsHxlU;_N87~rt)fRx^9ld;c}TfB9BpX6fHh6Yzd*AOi@!dER^A> zu`xwvVTyd+{#4;5oabE4{&|u3S&6@66Q=CsQ~H@vGORr#$_om`;kwKA##R|*PX>@+ zSM&QFUF9$hh2sjtGVG6ps69|SZAgZi1w;=lGfI==C;Fs;avtQVyoV-pMmx;ZgF<+? zmpc61hD!;Mdy62D)FDx;BP~;mMjDD>_Xsu8z~T;EfPC48=Umj`k2kO6L$__CESJLv zWN7?*gNl)RerzdP$66c23N z6<-Sww4Z60uRdzxX@kfavb0rV3f?koqzDK`kD0ol>`XuXcAa))$}u2g_)4%@$Qq4V zFH+flhWCy4t?-q^YapTk5ECJ-ruwnPb!!L^7VWdYSCV=XeU-XP^`Mg=p%KVvfYU1I=oG$?u^hgsLdExDd*R40Aaa~rRa^A^C&5Zna}AYx3>^Up zHL4D7pd1To=(E)lYHXSt(2j@&Q!lAhkkQ>lxg9ziJrYRJt1y`Zv7C|LpY~&37}Jqn z!)JvpsYI#gq;v$st70qi@hg&7h$3eeTjz&~@e89EqrWe^CR7Mcy7UE#XG@2h?hM|N z_Q8;Z$W>OBP73Bo;^@|K-%tExBFC-$%ZZq4n@1|c_4XtFRl4C@x$iZaJ)>mS=P-ue z&gr{JAphq0>Iq7X2)7B3OtAOJ1oZ=IiTghDCHv_Uj+wtWm3f5KbTguwYBD8uX;WM?oVMYSmaM8>{&-Kn@-Ki8EVUWRfECp$ zLJAYzOP3s0y@REboS7RBX-U*3+QwL|7nf0nUiA(eCa5fmb!dUihW=p&YPHaTvwE4n z@GwurRU0N!KC#0^OJ`e~Fi?NCQ$6-U@(1NRh1QkSyO_@pdww+h1R*Z=u9gk%hRycL zw6H^=(r7@#Vz6HyEXppj|FgvEq4r{f{#?5JTkri9Y4oTz71Uj;)iYF7q3m4f&9&>L zandt+nX}<}J!ZA(Qoiv*`x=SQxq77-r7&OJJXn7U_`)_BHfBo#D_~rK(j?e{zSKeq z0ygDg03z}L0K^Y;k~+~@DQ>8$l)nA`-_<-l(H0PXarU(k+#I|$+yUX!R^eGWGa4b< zfC`x}>LY-rvJ6YHGWiS}4{gYL8=JM4pwXDkyO z?JNwWMp-FE_=N(d#8Rt=BNmBP$N*e}(RT24oxYk3jwC*^kEqyt2e%fl`R2M0ez?XY zr^?^kr1%?;>a)6R9tjyz5uZ ziN`I+8K(ji42gfz{O2#}P4Fq9_kGgo)1E%H$FQ-$F>z^6%-4zDH`M|qlXWVNV^^lS zC82y*2gh+kGyGTeobtnkZ~AV^(9s&Xgg+@uASiEl3IfozuTPX3UZMl;fviuqKtcrO zDXCJrLSH0#qSKpr5N;QB97t&XsJlgGK z2m~uts&mWr!}-8-@V^GTF@zei%*SyNiBFTaT2tl7Cu`-qi?oiELTzEjiM=;`x7Uj| z!a}4sLQUgS#45@?OV>Ca6Vy{OIg0A^R`%Qts2U+KCyStn=C{kg;{RRwC$N zJUBSPrxBgCF#~<*Ie7Dz&&_nx@>ZSf`_l)kUtBoL3T$6g6!CuU8buWt;d<=vTi;}= zH1Ijv`l3)87$>@<%PA_1S$`&IELadnXK$yyR(Q&C!EX65W;wa|^QTXS0msWD*=n#c z1jNN<7Xir^X~_C%I5$V=>%>TMJEL6s`3owuT2kX{yD4-urxGoBGHlVEL&mGzZuX~83E2m* zEq+*O=$5#8+N{YD*JoKyJ@kHJ_4)rAqgbw;ZF&b#<;YlvT7g)kvo|@>8w!1O>tR~Q zI}3*d&tZ#SD%+G;7A1FsOa*&S7@*c}BhXC%3sDw*Z{y$~k))Or!%cOjN0oO3AL_Nc zV^gaqcuErT;G%dY(ms}V*W0a)EEZCkaTLbvva2X7LdvUyrvx?gqmqL$PK z{|q~SF0oA}yW2+AZ;g_C8;8=N*l?s0IH(qFp_F^PDHj~MIY~%tE$>)CJ#sQ-h+WdI zk1_MCA2xjnT^a1&YMSUf!(Ngbov|gd8GD_)tKY8an$s+& zZqP5aqIt_>955CEzMW5bCM=zxs(J@IyD4fc9k_Lu@o_c1bXp)zUS9OZ4Z`h) zUF%YM>a3 zVTmir4daK>cQE3ZCX8(WRsHK`n?Y`^`a)kV;bi2GPs%o^UfcC02xIpq&D(U$!?*pI zqqmpqf2J3czMT@JyDdjlAsC60JN3-5BAzA_n$RXHl#8mwvWx}}uLTK-)?5FaYUDyq zKF^dPojS#Jhnf94$&FE$-0XGJDK5~IvJ)GqD{>=*ZEKxJ9CG)p&wPTS8dol>bNpx^ z5_1|IMY=lm$vYRhe!tb3>_68|k)JO`A33mHTvYJAXW;Po^5=YA&)>tF9R}M?KMG>X zCVQ)m{pYIZzv=Nz6`%hw;s2z{wl?1kGGd{&@m&@f1qJZP)JAL7B%UtR3PT7Zi0j|F zhHpM(W4XMxjXd+y*0}0X_PD@jSA*=eH!F8TkhAIUMaWQw^B4XBr&W^Z`PE7f`=N3B z8^f2G2&}6L`TL$r&;gQbY9H2@P%2o+rh%Z)#8>Xs0%<_^|3Q2qOV`-XYQxi5bmrOA zMSr~D9p~3{E~?4Sc?Q{hQwTwR;RtKAV79Tz&=VXqerMHLGR^c1hNbtp?ou<$eXH!8 zy4;sl=9bwz+`y)6pK;(yg};3MM&v*+N5ytc9H@<}PvNP!#WWxz01fqH?ZsvXwa%&awftm|aIP{B z{N@lUqqi*LSb@79KTGqTqt^E!1xDy^(w+btL7UGpOU*g{ke~c1TQqt;q7Z4^DzRXY zL)gl2?R!~rpG8VjXNcR~D?wjal)=GivfpC=X7lmzwqlxHe8?C`_lz3`oKdBn6~hi^ z&(IU)P~Q#8$nj0jZ;Z3P2g%rdjit^2->o-sN!gQiYDs`&I_b1kOgWlZUKcX(t+`c@ z8pfkw^yuv6Bl*HFkDj^DO1un`4@n9EylVit5zw`0yjFf)NQCoNzH*x#3nQYj3Gk#x zIj74SR(xMYpPYU@K3jaHX*#j01yPP(qvcL?S^;*4w0u-&kAAmCLCBmRSM>Yy7e%Ux z&m~qz_hBJEFwD2AInE&q{o1t?1At`7oQy$;H1zuDlFI=;zU~{@dm9@+H4$-_itvGlwFU9C_Rz;3tK07+TKPwQXOX2$U#bP* zLaMvoGr1T#iEQn>gpnK>>`&$x_7BB@bd^Rs8>a!0XRkld!n?mPwssp-kHP&xEC~b{ z{jq2&D&F|&1fxgm;?F<5YRTZ8^~oB^1Hc{YG{2u+PtI*Abgz}3KLUhn0)|nai;+i< z(Yd1YF4a7~igdNcT%V&YC+o%wYm8S1a3oUhgM-4N5M5p0c45)&xg1cKUz~?HJ)7n` z-~TR);3{PFU_W0d064+fQa4=%NIsXYM$%quKA)7JFY3KoA#F14p-&^U9<7w~Y~l3u zaL#A5vD!Gs(tG8A6O7gYTBmx+XWC0Q|Cy@V7CT%`W7D{cv|HW-pngp;CxFn43A~eo zcq)?b`5Vx4q=Pw0+9C7`9O!nYy=`{evm>k{CB|- zpq#T59ODiwU4J1xXJS*Pn?Y3G0}-Zpz| zX1;W1ddr79QZQ>R${V}yNdqe)dnaSf-cDAHP~|+|2EpxyA7$Ln-W@~==FkPUHPvNb zebpQ&wRiB}VX649(w_^s061F%?xY8mcQ%!{lkZfsIYY>Ib9FiAnKFQ!F?Kz>M_N!+ z;Por0KF#YV1EwG-1kRWdFf+6hC!MnJd-K@s=GBcTZ~ufbp)QYCoh$PjI#^$kpu1;(ni6=&0Tie1I$|0q9>) zT{I5Yk0rd(O4jiKxwu#kqU=-J17ea1O6wtTUXCtT4)QRCOi?5FZ-ZiF%@ADPe{iRn zYN_6Ra{=wsbi7tBs4meFP~FTO{2P6uYWh^J+hSPfR-@_ZeyO#F*zRGrZNSl-0aY5- zH?lLPXIWhW-HT=LDFgY}-=&5X&T~-&L_Jf!8bs70dtXIm1qu-Grnan! zAJCVD+qo=0?yF3nytNaxT_!%k5@#lt@#r%9f_H#oxiMUnDV&6*&xt6SR9{k7A zxz1E+dWt)$tL-*`=hfN`)q(T#1R4}IZwbrex~+d2VWqKaz976P}1FZcs-kCU>cUG|_6Uu55{w&_A!^QUgywl>lR~b5X7>D)_rB)N2J`O?+orgSxP! zeZYPF(&bwATKNgq z)zNwn0;0i!1~_nucRUzL?f<=>PG1tB?07G0?RWajEtT{d-Hg07~Xv2xAlL+;5X z`bGGI)$F>%jjtR}!F;tU4|@1bs2%b7Gl04TE^lfOhKIor%-~oNqwL#gq#w)8%>@YP zjkg26wvrjF`;w~`>YBwBdacU$S8)x#Y0_px-;J<$oj27yPgkP?6`4>5O|>(L;-~#Y z?0x(l0f%GPGd0w5v;i0&;HFp?QAVG^+g-0wdvNnCm8U&ZARJtYb#${DD8sTT25*Gl zhc?)t4mgQyY{~+pcdN{=l@Y^QcRSPOQ zrIx9W+FGA7KQKUORsNA*NV6I^U7}_`TL!!KJ|QGB$1P5TfFYnl@aRXc8=uTl^1f~% zVh4*W)jI$%N2&dv=KbR6V36l1PEQIec&@7hbwT&NWq>D}-YN6%pWiu47Fx*B7fhxy zSJ2|pDNGhw?o6av=YdAEK+s-NMrtF^BUdwT&Yev|t8Eg6DSm^SOm$=7>S)VJ1Uc|A zZ4&{m)Y!3h>tN^!G@v;Fpe4F`dQ`qfA78!NpO0<@Xu1yNPDA&tJWvGY9q{N86FnaX zkJRpAj+0$#nxNP3cI#A9kD*6wF--^E>#|2?GnhcHoKSX{3r3uU@6I0-P<0tmVKP0x7jB zEh46)i4Z1uJPrf3qk08)=(1(E9G&~dHfk2mXJkLvN%6qu@Ip|?;!eo;YJP#<@sCDN zug286sfpjKhJ)tSv$RbLrPR$P{CE3%_&A8(0tt==Q1o<<^d~|2@dckatGe*FTbL(7 z{!GTOIKcuV$pbB@r;qv4U9C zod9sdMahCw)2aJdH^oAOl!BJ^L=sPI6&LbHwCp$v1@?;Np4e3XwcY*Ieiz5zAn<*< zl0QHncmgRNi0iZB!|kJu{V-bn5=keYP47grs3i%w9F!6SVrD;qDGfGM>~<|KuaiON z`Fih69{%X2z}qKh=xUIy@2WLZww*jS@JE8JPnj*IN@K1d?RxRJ=Xl{b62Ox&?VbK0 zjXH;QS6$_ujp=%9YC3e~aBla9zo&#KdJKTvju*zkyw_mU_B~+W=~0I-p0sn+N!Qr| zXI}cK8foaZ=&Y|QfyXW#6$`#w z>*(VPv<|2+gw~;d4VK2Rw7oi(4LoR;v`!1O)zWf7UXnKgsp!+wmVhg70Tyk60*t1q z6Uwe<=Kt7CsIRk<)Mc|?=s;DLxu&ypUH$5i-};8TRe`V}wQRBFqed6uiwFv%0f~KP z&lgdxfce9|LKlp`htepb=_V_^$RgPB@f(H)YzI}EU&Z{Rw@>Bj76Itt=Zv=Kxi(vm zD_hJNvi>Zf)xlFT4FIUfZ$!}UZ-ShNYm;b1Jy8edVleRL(3*WAt)8HjEFjJ3pbxn> zok?vqi8Mefp0gzo2lS0cx=y^S61CA&(fX;%rmbIE2T$@CQaboF(*JIB)b9j&DC4)? z7eY0?{Zf9)bAvqMF<>~_u0z)yyRCXP7}c8@J|nlBIh;SmG8~@Grv!#~Fg5yYKd{-^ zxxUmi?cDUzHZei9?kp{_GD=%V30C!9L=9Hqs-}jHL46_UT0P9s&cof5@uS`H{1xf~ zJS|bpcmP2~lr8Q@%2s#=m5HoAZCf%&V(WCbr3Dh)c__X2$EY^)NKp1~?M3$cbkm6G zWCUo!D;-BrtA}5sm90Pa`6O#M6KvJ`x0ijTf(F1NXMHToCzaGHS(LH#&O2Y4TlwmL z8~|i>NdSBQgL(hPfinVF?F>lDZbaNCSY4*N#u$(+j_ah>&d=upiy%G;y`w|saJ`d$ zzN>aY|&)kU6g}7k?1w2-VKJ;Bk zB9%aq62RGOO*Ey$*mEjJZy{H!OntYQRrkMVYKZ;#(TY4dHE%C^Ged-&=Ti#j@vmv6lC(9k%VAj% zFXWk%PU1i$;U`|de{wE!RxGkPod(}hz*v#)I*V=R znm?g~&%7IuIsWA!YQ!1L!OPiao7lMot@{b`zvjm1@t5C(`qmJLHAFWFouo>%q2Y_F zyp=6Td1NQ?9y1@+b7)Ac1=L37G+VowK;G%Z zcsNCpeAsGUxk`ni!1;;R=#<_@yY>10u$u-6ZS8dY2A~o@7MisuL>^u!sy^!z}>6Z^5)EWh$(G+eLrr+V4s<=RVK1d-Mrn2 z(+zMaz9d9;gNf0TXqsuEe|CsG^Jsg}36k2NfNs$xU8;}i^!nlj#jMQ-En-js4Ux?WWRIdt5<_H5AP@N#^%cMn|G54&v5 zj$7!x#e8_5i#IPnUs!GbRD~Dk-CwYp=3_YGsxJHp6hCCY@l7dusEp2)Nt>Uvmz%Cz zP^5*NhdGS1hN`la6CYyN!z<7lFxh6c(|G%uORG9%OV=d{N|^~2w20-?_%YMr1JdYO z4dl%?EtB?+k!M#@f=I$LEXpT$&6_qys*$!d?5VDbAf;!ipDGPggj;^45K>Ll)77OV zS*7#&=>qmFQ1WIWAdaFREJ0&kGZXZyzXOIp>i`RXbA|u)0Tb0>hZ1m;ynUeySF=a> zUbxjM3t)ZS5W67+gnUn%b-@pV?K>ClqREpN zZbsufNbyu>s@M3d$tdwc-2W}QQ4{j1PPJ}zt8p6stHy8g*<|V?&GR|m?Iv8$bVZ+) zKw|cN1G`P}6I#h$OXUZ_rS@HBzTw@4_4BM4To_%8{tGmNP?o`As(8M?{P|zhrts3E z=-B&EDf6|gD3HI0WC-u?$v<=lcDn-Xj924YxHt*k{1~{%p zqwPxsbZp!@g>9#`vVG+_(Az>4e#EZ)t2sSWjRjR~`UXqAkwD3zUO&4#_ z*|)^wsBCZ?Q^KM57!xTq*w#TQgNTBRwyJi{e>ptXUFsuYalK?3YH zd#c|Q2q8(hZ@3OE>n^+2M&J|o!xRD@r4Ou@KQR_ZH=tA$MbB!|YYxI-prD#XIVzE6Rr(ms_Q;WYRTYbMYEoibH1I~6Z)Crw6OtcF z;B^5|N?G(G;muPlQbXpjqvV#a{x&adNVaWRMuqJ-V_cula}CI6;X1$`G8=I1Vizm* z`D!=ztq1WWg8lXg+xd?f6Q-#62M%Ea+i@1k|S0M4M{K7q6QT@{SYkR0d zfD)Vs6)21LyGI5e`T_=wQzeeyf;yAEAFb7E0U$|V;$e3F;iOUqgLSgAD^g`8D`SCr zw>k(5kL|CX8R{9j19bku##nt(5ij`-jk~hh0Y6hyUOv}I6+4S3Q+&dF3t$kT5OMR9 zPbX|qw%Tl|{3nMYrd(mssw|!U=Y1c^(!iM!rOTE%qSwqAviR4 z88|n%t)$}jGU)e8@XEDGFY(vH*-v`t{3f&tyA7si6Ls2nl*@`>=f2y8UJd<~=5lTq znk^%s7JkSTB?NSzWX=y-C(Gl4<1hJ7RM?im8F{ac zD5*j2-Qfa@c|`l(KH&ut^l(0)v5Bem_cq9Hjdv#VPw~5_4Pckv=M5=EG#-D22LWSu ztgl(h4A;0h9JJ|p4JSZvOKsG26k5dNr-qaBEbs zUvep#a9uVp_bFEb%{i`m*K2k~*Kh(3+=W4wSNQrm&m%K@q%K61a?HlM*%@%F0I13k zF=ksk1Gp|6ekn?%a5-tqIQAa$$(|c4M_cHpN?KzSR+ION*;8TTMdmz|0GkK}1zExT z<&*XTpKZqK(7nG$ctIsXcNiooa8mm|ePm}{AMwquNwsoQh9%T|@!Ia4kaP~(+Pum` zCSNHOCr-paFBQ5TUk~cwQoWZO>7{)Ym~V{;g+J|9Z4DhCqadejhnb5S`YSs)6f}Kl zJ$BnTG#(#Ao%jJ9vm|`)G5bsB7b;c*iAGSUJ_-RBBlkH^c>tQ~#E1W=CsoG5>8vj5 zIO^=-J#wO0O8hr0Ib{iY0DDqzsC<0Np6Jjpio+JBsI_D7nz$6Iyv6@&`d>KBP1= z^`a&5>Cq7g2sn=|R}Lw0knj2U8-;JmsVN^bk{tXPj&BYE^azfH7g^fcLd8PH+^}VOFXn^ejm^N7P4&n9s?Y7HCly}zw& zLI@ZXj~uF2vqo3oWV^= z4;mqh$KLBAA*P^U&1?AP5`t@7_2JAZH`uS5O}0t6lRf5LUjgmfc0LfS2G#%EocGmop2_wn%GkC{^hsSo^f^?ZGOjWSdrH@@J!Uv zruJ(q>=SmDLwV{b#c@OY9}i03&Ks$YK(+#gU%lf?8}S;j``wQUSX!T|Yo#izz1}~* zCfYsMhE5@T5m%u&JI#Ej8r?MB*xhl{wtmagO|76oke%bP|vA4B189&A8}aSpVe;(Dt+GVgV|xg$)HZN=TzT zRmHhWk6xN4UP^OXe4j>nU;k8(a0c`4jUjHr`%l~h$^DiRG|KE#f{^``9goIR~k z$H~-(TF*b@;ez&F)q)*k9yj%s)j>#Ke~8`3U?rh)0fJloS<6e8L5Nw*pBVD7~hW66BIM; z%nr*QYcRzP?ZkxGp7_sE%ifQd$XASIF@H;cv5ddWzF_5Md=5c-H-^|QlVsTPtB$Oq z5tySt`)2($b)e$ZQox=VmhJiY;$|LV-ktM+_7J=#Aphb{{Xa|b{5YSkzq!MKs0>=N z?yforrVJx5P0vtzQfgAqrCY#p6a;;&@SJDD*Xb9e?bSr-mwRCu_rjEJJtpTgdnA$d zv5eCo$8VsQ1(tg|;bHf=r<=D(eYv2u^>&~5e!uS=paX_o`%BsiZv3xVT*UYvOaFf` z!#@18Z2;-vpuaxA51PyWAw>k(M8WHSxKQra<_++hZ*%NmhXEXz*OW&IvVoohpsE(a zcxVIZ>py?|P#W+!*e2@t8HhT-zpcFL%V@Hh$#t1KnI{w}@{sv4=ScE0@Zq0F$hH2N zmGyI)S7Lq@otQzABP_IEoyo`N=3#NXnUtO32%+) z@2&hnqSD1h`RUU#+r;SSx^6Vd9dVyO3qmjF8vJcP`Xho1ff#-L@HK+Vx1JFX@pk$C zMW=#xeg9(@nj5V;2853jQDw;j)p9`+k$+4wsOijl)8yv8KNcGe3^9Eg9bauSlzcV( zvW&5VLEEF)WoIFu=ZF1`b)F(>j6IcttCzp={_BC=)FJK8Vt(kp!=EcF2KicdR^}W> zDOo08Ko?W2)K&r>Fp^#y{Y?{#_pe7xW4W%N)!idkZ6tfpt-?1boQWw|`C?m_(aje@ zdw$C8#2Ln<+)@BFCB++)|6?~B4%Lz87L(ii2}axpnkrtK9UNu$w@vWYuKqR46|;Cs zwGkLZ5wsd#3;#>g--ZbBJY&_897S~CP52i)1IoAHWhj5a+lz+>J9|Z%O)8wCZ$g)W z>7ByUB>Vexq=u(goC*I7k1q=XYTD6RdOT+x^$c%XZ^4e=CUSS%Y)g^u7z^#(EgoOG zTbKRes>$|WI|#X#g4l<(aab_3a?r!R!Uvqn&p7U42u`mIh|jL0M+dd=HsJqUjIx&@ zpf=cx0zCzLYY3k_9~v!yIIO$g@jyUuR6~IGN{~e!9MYaeote;Wwc;ey@3F~SE zSEq2q2=S=XpUdFs5dk->Tv3pQD6`|nL%dw!zfH)!2XV!{A02eOG%B|@=XlXtJiJ`l zzaL(RWc|A)$iM4C|C)neFpQah#wy@){(m%4|6R}VpU*P?wkP`EGVxd=^uqqR)4flH zE3C&o3BOP>{aF#dG4(_PNeaZ%XT*kH6ZM~$X(ohUzW7%sEoed1K$!vnFe4B(0gB19 zc8LpGwfL9T#LqMUYcHOV`>vN%HcUh6aPL>C)7Z>E1j^BJ3nj8YB0HC4(yBu~TsA3Y z{&O24ccbD%)Or!oTV}cF$9<4zC7$%xjv9?Jh#vYY{#^)aSnBCtkFVD*W?b@J9>iN? z_}j1onj3QQa-#?BNO)*s?xjm#Fn?Eoht9h?QrUAIow)*iGU#}M!lluF&3Yg8XqHy~ zE0@j*HD*Mun=@VxSlwfIdkKkjocVo{!R~l zys21-|E1_(b|Mc^3!O^fGwH5soF&4m5C5OmaHDH~+WN1BPV=U1Vv%i~Z6e&WPbp_N zF?)M61TUBV@4D&Fto%$-F)^1)Kwx;yvEUz@_`j`2hw=23>iLZlE`ha2-+)kd>qgG* zkRA_ZxHik}TzT*%c&LSEje(%rx^mtPElH)%g-?ZC2@E!Wu>!L5?K|n3$IKd$MWQ*y zE}0#2cYNz90GWRf{uh!5mim(-$;AkI{aE7GL7qB8*k$4nTe~o;3&L*tNYCkOp^e`t z%XxvMR0P>1-%Lf7m}g@K2V5*6olBd%2(<|j_jFyq{P6xW*)t3tF_1FJ)WOoxN3>V@ zciniXcOC_U0JP*Cn4!tJ=QOdO(e{ZfRU82!MsfYZCZpE`XkJP@jAj`TiWwHTqRdIa zF!&rY=FoDStu`tbZBZGRj~5Dk^unN0hL7`pxs=`yzi*A>iWh%+;Y^HDhh!^9i#5pm z7LV6A_Uui?be9ws8gMH=c*XdGp^__FY;hgUQ`Cxl5_hTSmVWe_M|?Ah&}eD~kRJmZQw99k=i&|C%fN{LSIghuO#$!W=D)VM z|4ldNzgEvbR{y_r1^*8l{g;Ws_Hcc#$h|B&f)AK&lzr`wgMp4N<)%%@*5AKyHYYMK zR*@gPfZaTl1oL|NGt%+NJyInV6~eczTC~Q%{mNyCzu>5^C&$kBys63UE;evX*V9M^ z{OM%u>W1Z3YH2e5w>7|Y8HHP1T#8Bgnp)^f(kD0438PpZ+e~NSL&qr;yq6+GPXo?h zUb#@bfL4lPQ3=@TS)g|P?qt|(C0v6C06*ey8P*3IP#}^)FF2f(A zP+EsQW@ns&@H*8Ng*Z;Y^;2aMJi{C?kxr=S7`WNQ?yAN`0 z-0bWfo5sjW275*`Zcfexp!V?6CxixUWi>5`29trLiJY=$uLYrI4A`zVe8`;UyT5&N zFfCi1~gz$^I{TwgBqy4F|h(FX*PO)_lp0F4(0#sHrY6nC+$Cs z&T1SZ(vKzUbEdx-xL5uTT;If^^?rEMzKPQVqSki;8?#p6!}9+!^nhx0^l~(dc;<(;E1tK2$%XFq+rJT=_uD_+9|+v4T@4|jOH51S>nYnmO|=in z;3&81OMGD7akRVSi(adA|2-@{5A-}rtd%h6hVgYean~#aLR?(@g7n|0q4}ejJ8@+Y zxf*DnSziGolCi1AOL^}#c<-nB?J4I#d~1NSU^2kJ`2mo7^`*%M_9Y7I8oB_7%a=7~ zi1X$Hv$oLs?Iwe34=lSsUAZYWh?diOZws8baB%izX~b^TtHkmEV%y?^Ba=Id;gt8Y zHPU44Mso@1y-eD}DBe}_15eMtaV#o2dJmZHCann19ipv53q|(2T~OW%=JoE-6NVH~ zr@0J;aKkjDas=q~*NhO=$D?rnjfqmIf%ZG*(MP;Bgo0#2Iw(-f{xe?goODsRp`d$ELV-ktO7))0=aE}nM zFuv!yLT;n4du_cN?YUgd^w?8O!HfVZw849 z&8}2aqaLZPa`Z8+-0lYRPz6!#|Hjv;397MLa$i7CB$34r|ggTQyp;NxpuFx(WD za0nK|5f}Uuqohzqz!bpfb7M#){&jEJd{5he+$l?2K^R+2DA+E((7Ol_klbFhXFQpj z3=P2Eo-Z+u4)&@j3zZ`-Ikfx7QlA`|Lv-deJR0NoltY=S^ZM@bhj3xA+u$pfJt3Zy z^9sJE`~Kc&d?-Pi%jDvj8WYp?N_>27b%jtS?8}gkFP^Sk&xW6(<$B4?l1Y1@DlLD; zMWh8_H2r>?sl+;xJ3&W4L8t9-t`=FPs=`S~sQgQq9}OC2;u+sU{=oM;d6o7fsKP~0 zM2hJia0h!01`N)nifX~v+TIF_!CPvjqc~NelxLwz?_#r(DO*}^lI5LkwwSmh6h~-khbo?T zxII6%!xUE-tjFGVn~`!l-$k4QUtc+z%UlYg`$$8|fJ`M*xB5Y4H%Y%LosBr&X^+{* z{;x<|&kW=14@QgvU@z@D=Rn4u+-(n0G+;&p9g;rA!Uw;boJT#aL zI>GH;`sR?$VxesR>wY%9HJ_8Xwtb>GpOY zE93~vSbr{a^(ClxZ6$qnGs+Dq{8nzpzVPk+u544(FJsM2SFxX;x#KIp% z7Jju>ez|nlRb~CyE6U2zC1-%syu!;*L%3sm*XNDxTF9*;d(}dwF4t$v3GWn{cDn_& zu?8e~yh`pF!pULrVu@y*RLOJ6>xFBGO7K)YA?dm@{0NyH?3J>NV0lJgtplI$^k%Hv zEMJ?2`u6q&R)c@lITqe_(xtwFxABSkb~HrnMd(NL6Sv6IS@#fmVX22M_;T=f860w< zFsBCpp}ora`zM>|L$-WGr+1!ZKFSzKN3OiG+@~s*KvxKo(T=;D12W_B$e!_Dql0PK zw(4_oxb86F;hh}T$;rN)ffHNsZNdP3{})KNU{VmGvOR8DhFP5-P1j6~yW%;|r`Bx@ zZ4Sq{WDucqbw9Io@xP~kLN9GKQ{Pu+peN6v@PKIPhx|=iVV@bQdEVr+*$kA!ltiXMW(#h5}OU_yiOXCB>#bz!XNRA88nK zKE63frq zv4^C?T%h5dnB70rm=)l*`}B{#)RzBFuo zkHVt>Fr`Hffe7C(vI(P%G+-ZGa_O&{m0BeUIpBL?^wpc9)76#Db2a%2-dYTj`K+q& zG5y;l%Vt0;=vMM#aJ#NNBa ztPupULWv!uR*VSm)$jYh$M5G)?&C;Y_kCa2d4A5%D5W(TuR*=iNp4fTf?-0^f!Ffy zx}6aYy$7Xx=qY?KyHPdibNtD0{rs6gOUv(J882h5pW`7OFNxVKC#7s{m9j%T6|&`3 zwJu^+13W~^syI36WG>G-?&kG=UTcjGPp?Kn?tXFgCdK|d4-R+&sbq8oDp-Z66Y5s! z0_>_E7sS8De91`ov}4!fuFxpdJ#YCv+w20T!X0UeorRfaS2OF3?Js~;Kf{i?)U`Yn z6Qct>{hzl$tp)BK%7<$GRqQ_Kb(V@-V$FB7zk$eznhdismSMTb^AaDza&alN zQW|CFns53_RWgX}lEZPeZ1kvh35OF*++<=(<7x$UA)Qg8mAkv$5;Dre#U#D4q?OH(BsMc z^`{++SsXW@*=U0*UO6r_A%|?hb9HP-cCGJ;XubQ=9}XuR4yUQAs(oF;aT>QY^xcp~ zza%6mtfH!MwAA3$m@LUF3IXNfbFXE;+{d?6@C6#~;hGyo2z_`0{XGx<0ct?^&hXQ7 zGaKIWT)@kXno~AaLH=>7FX61a)ZE&?Xy8TZVF%lhPuJtQ>Y3){S!#nlm{2wnhL>)vDJwL42WU|)lYwF+%a7|p7uke-=h3wM3OuTIQrA629wQEU>mx`<6 zrhR=;(-cKo{S%@u7jx*xi`aLQS<5?+X}H1Fo4cD^P?{A;ZlPn2SWO<4E9LvY!cSHs zi9JP4ezYAu)emjQqdPJjH-ZO#sO^gNNjKrI5R)alM?CzowGvwkJ;{HjQc@%_#~tC; z)+YmQIeQ)-liddSX_eE8{QNc5)$iIid36-&-s3}>S1ps6mPeNrb9NX*o`FR&Ri_;; zDk*kStD9|7KW>DkQt;Wv$0q{oc2|fQ^9o^kbMtdOz|w1e zAoDt$({K5*O3btLO-OsA^Z2qg_f$;^M!)L1dC9wJeO`nJ}hHlexWC2Yb~WHa;)6tWKt}+nNkg1aJs0}`o~yH z_>ui)tEd94`uJz~5x&ZlMm@WC@_kFohj}&R(c8g~6f5LTRL~9229mGaWO&KD?does zZqEr^r9!wgX;Rd5K!fd``U_4XU%nRU_5JNd?k0`H->IV6ucqRoKvZfSl@?V`Zr7{S}O95#<`+*0k{wA?jV;k>Qi{hJr21`&Z+utgA;pnVq z_0ncOkk&>=Cox|NfgM-4jceO^w+c06|MnU>Z}om0fbitr+8 zHvm@qgQsJ*gpa$iZ~mncz8pe%~u%(%!8->-t0&W57B+1A@L$-T1+y_r4Y<+ z%F~zvT`WjEUra;J&9kPJSYPZ+&X%Y4s1b}IJlC&<2N-zHYNew1ug1KM_fnwl#VQ=w zC!3v9y5f)UR98_?-5iD}1*Pi?txRU(eyMhk#Z52&x6o@?o-DI<7LCiXF=$>mOc37H zlCza#fm|SxcJA@+v(o=ynOUi(O^y*fU9x$M#?iE#`*$hczh`d~c=-5UJe_I1a3$bY zu?x1AMyXzoRpIU|y`wV18SKl2u=nFO%T*IN2 zZ89GuXYSKU!+J^NAiuxncyanqleq3}AOGI6Smh~q+Ho3UE}bu}ZZ*$rX0x-DR}sB| z&b%f}@%CPPfkvk5B(5j>*LB%M#mC+Wtto4)S!*{7C^#gJxlU7Q0d;SDT=Uq4!d@Ml z|JvY7wT-AXf9R_k&c`qPhky<+QrMfER|_!vQet@gqN3@8vhaAtR1t~4!+i(Q;6Yyp zS$SZF84hP89MxpKAqhOydQ2y|UyG94X_0^!eYcxkBTTWxEGas_=DAt1pr9ZAJS;0K ztC}U?c#S}5uz1dM6Yw1H<(xZtb)y>|vgPV3#d{mprd$e#Va`T=5VyjN`^L4q=i&`1 zrJMZ!oKVv0IHYu)r8HXdo&I`tAR;G?!}sW0c=-AAgJO@IZhG#2+?~4qRE{>w;ZIBD zjB4ZYJs+6eMkq4I?|w{kn5aP0Nlsn-s%B62H5Emc2FUNC^cqMDWE2050Is58MOa;k zx>k7DQ$;_;#oSEVQY{NX9N!p`p10DA4Z$3cafv3!x4^spaum3?ehr>p+&ZYoH|-sc z3!XU}s3eQ7{PLCZ=0^KWYF)$D%pyz~J3gGlMUamk_`TZ9?ks&xTAd8CU@e}75WOi_ z&AGWbNyou$5E;hhL+^i{w`@c2L%K}X0TroW{y+$&!G{PriZ1r!4a;Lh z;ANbi0-Q;==s~HQKeB6{fEsQJ=*u>GR+SAG2-7yweUrQ(&m=#bz1B!A@P@yf9ni9H ztX&f^Ca9@>P(Yi88?qjn6jfE{{v>Tp9gpUwP^xhlA%0yLdynv^g?SccW&^?$w9UMv ze)2>8WUo(68_Y2sn%bOfJ5z5vf4^P5x32*+sL_>oPS_ByAR)ZIb#}JIyDxiE!?;%d zXjP3Wz$`1&J?Fi;%vxBtKjJL}Gl4Da7$zma%3DbPvao*7v6fS$rk3?_zPoYYDX1pf zV4t|&Fm>c?8xqJQJc$C#hR+@5VR<)dxr9XiDw|CZYxKD|U3kLr-Wp+d+DG_mXyKvY z@h1`aQp0k0gu5VF=PMt|54`*D%w`t8caJmz%LbrMmjfYMytw)YBGSCTGac9%hh->d zYTeFyeSh$W8^Ms`BPA*-3dwo9wIC=4qaMjJX2T)o4SIY5a!YfRn;v-XNnZt%ln#g}ARecbW~n z9IDCNJ@9J=NMXwdyTZCIkJ+T3f%hgnEY8q)1+W-ZBIBw)liocx?d~BCNywI3t8uUUKW|B@ePo9JA%8 zj*G@jJiPJo2?+^tlP=R1qK#CbZax?Ei&tf&yn33#6!g@m#wTZ6el3#5eKrdM1Yyj0?|8~R%;!lE29ayNtkj4hoaDYrX>?RyVg zqjYz+H18oFxja=?wtArNH_M;HJvwulPY2s@3_rnOTeosJP_?;V@GIOOCs)OzpB9JO zByR$Jj`#Yr-O1#Hgmi?Q!-Rz5M%=N?Y1Y31e~hA>F|o0WyR^XOS&&vj&)Cvz+Wt_c z9EIrVS670a--MV3;8VeO2ZYd5-KD^?6}lru-%SXq$Wt88Jl{s%au}~Z+R-yP@NaW1 zBJioWs<>?UIz^^P%@A9SPS(ka>qgaj543O;*4R5AH&#Vd3n+?0qKs3uBvJax3ST7-E3u=V)JbK7Jg>C&T**?pN&k8Nls2o@!H<#F!jQ( zX_V#o9j42(U+yhU;SOlwA3?D|CDb!*Jhwn6eJ%8(SQ&e7(vF8?pYrYJG&)l~sj=f% zcQ-1Zx(bL8cVoJ0O+7r>5jnuH_z&`o4U^@}o3{85O zEhz=ESmjtpvB1@XS_f5Yl$V#s6(tW>76J)d;403cCJJYjkzuj4B0ul<>fB<|%!_S> z^;5S!rM^C^xIy**d9Z=iV;b@;6`J4;g<7AV1DzM;rVsJ=){*bnH@Egfipp&uO;4=j zr%av*?BnpBsXWb|D&A$hzK6LBtsg+HZg_hbN3~@XefFWwp0GA@F*}Y@^n*x`oxl7% zbKpdvr)Lha@Wm|+x%noxq@-Z8R`Zg?7m5~5=JYj#hRrAxO1*DJT-}h`EgFE?8(wGm z9_BdE*kG!!|EDuh6C78;m+y#)kxjRYx$N!)zTH_cMIz_h7ER^;e6~h==VmY@2>HsH zz+nj@M>eBhp0K9vPIs&~iCqodqaXFAglmGr9zYt<$)hnK7r_hFDV43VfC9&MGRp>U zHO3sP39SIQi+YL#&T;Bdolo~Y^<)R;0)WnrUaYEoHzsiPQchM@qa0%Bz{4)p_6jvG z0p?DsD9Ow$$u+x?1c&Aq3PcFLq!S7#5qYwtxcdFbN* z5kTLkDJ||Af|9PR*-NbH0C6w`nWFJX2shZ2tu`lK@c)x$SUD9+41OOdD!tc_-Q02$ z6XTHgn_jax+I?;wsCln30Eg8yM$Z4q_>i$BQVmWP6O%ft;rg*@5!2GWZ-Gq17wN4! zN3ur+dZ~8Bq)5dYxaZaz7cDuKlkE}W$g z{b(P1F)|B1+&!k!IT7(KKVwDBcY9IPkLh zA6`8!_dn_TH8pHWa9k8(dn06BWAzZPaxKjp7?1XG>*{|AcuOH2q`CBEF}2HRN>kX;dBkosQ&nnC#twx#B*>h2 z?Zg%wog8zpm2n!#pA;2E2|lhP5d0!?w|A+8lFOwjb-i{kET0c4rNADlyM|8ft2N-9 z9_dh5MQldXj{fe?V&DcVArK3oQe;0LPpLY7!p4>q6m)tbwPAiv!*hN7E>{%oio$j80^z{jflP!d7W_+ zWV0v7%(fd>R7J~oH#5r4fw*v5_1$zb!oc8Q2$Ze@LfeP}LpIodq=_O3#*~l+ueA9Z z!2uzz$0@;K?#8kQ)z=KFZ1fD+w`sA;CW_)$ES-f+54tUwrX*H^TtJiEf%f~Q6GddL z++@DSsH$c#nJj@=3BX+ndb+&KhHw0;E%EDjHHFF%wL;7>rqQ)^@R71JimRmAWByL6>z{FeC6D!zmnnII;Yg(oJfWBtj*HF?d{JsW!4Jd z4e@nRwTt_GNZYp9<@Rw$7ZQD8!e*&)D3nw!VKLUSjpP!eAqe2OD7&z{G|vP0{QSJl z^71q;b!YFHm#m!~T(*ku?UYaVAFxhuAx<{EKMyHmu?jbwMlD#4A%l1wu5g zUz=@QM_>QJQEy3~A*NA?CFLP~D^^pMDDZ1(OTuy7zV3bS^W~3ps^SCo(9wK>!^=^I zYVTx87wbf@)9{FacdcFh?n}XG3DF9kJ!Sc@BQOgfZG08#2K~zxcn$1se3?789bZh& z_GvJ&gPz6jf!&V7u|_Q+el9LFI9`O|-O=UfZ9>txp!bfU7JcY20%=`>U5@bUSDw438r)GG@Zh9Bv#8;qGyIyrQ5` zn;48Tlfuy|K=%x#0@hz}*NgeDj%}!my0!07kktADVuG8y&${sOiKi*$& zDM&0Hyi*x4Uk@nI2)|pAh<2*boN$zn0>wKxhXQ15K9rr&4^JpawzTdbZGc|x2U^4R%&9*8 zjt3ZDpylh)uur+#k1ty5ISvRIg1IU^>R2B zP_i{rH#aKoItudt%jG&cGxD-Uz;+GAb~jpj8Rdo*-;#8&$6J|V`{_pv?}Lff$;v`3 z#^rN_0~Z&^WGijgUy;8`|H*~80@oWZr&#n`k(7 z{OuAWYmeHi1+PLXs4Irc;aj#Ie#~`{f`0=!Mi%2w1%|qw1SzD8^U8OwEZ*1HEx!v+ z+~uUC+CsswdTB+c{CU3oBYxQR@2cf3BIQ}jb_D%+$F;a6@!5r#@7YAM)JU1&%V!o#a$f)DbGfGaNJCp1A1y!|UJPcbN zY-hAw^{wZXQ*d%AiNCq>R$-+U*)DxDQhGfrBcla8U^h{Lz6bP$*-*gV}c#mP1ur;coJvaHuqB-g% zndbtx+-a@lic-#3=E018^}J6s**B+^ol1S4~@gi{i| z?2Y0!$-=Fo0ZwL=8Wp@f@RL{3mbxjkvZT;~_6{>kHuPgq0Y}%x_(Z|56+b_C0-?xo zYwfd*^-j|*mZ(%e+a?!Lc`p!7Eon1|DK8fn6}A4=!7by|+i9OAkY^K5I4?cM0=;{$ zkF-N31mA_Nt*FUG0%C4TXH~7)IH!e{$2n zuIeN_QxWoh!%B4~NSCuwgT7#E&b8l|{$4SEzAL!zhVa&iCKiv-N-eh}DRq z%w1p2n&BEQeEgPPa+R02In};qSopH_BP*VpCFpW$f3C~5eCNPDh&-l{Jn*i1gbN=Ym0qc<*h(1)4+KU{!lVmJNVHSU~=97VOks z)z>(_A6&zWTNB-v^-p*#BCyN3tBge9e@=KJpHviKDjV#7tjB+L>#`?qK&S$fHyVqjHB@^*gR+e4&2?2{^ZT_Xix#Lyt1wiO>2m zfs|%|=RZ1W!TA31<7mtL|FX=$(Bmh9s8EvqU^`4!Iy9n+eZmX^C&~Mtg?2N18!7e0 z&Sk|pus$h15Xv_!89agc5Ds0~=9N;3?%NC-UfshSb^fv}?%?>>v#rHg8wR`jZwUS9 zKOwlFOBnHTgmQt^%h~De;t?^~(V~W(CcBt)G8nFenqG@q`y4u(C-y`D&-S^y@Fudq znG=8|DdG;)NqiJWztO#0<(gq97Zza@(WDNhd&&$V9vk&hyzb_1_=UGewRR z(vgc7>z86~W8ICJf--W@KI?`g6N9o9QK*(`X7owfo0G2S5wJ3`Yu8V>p&@thf*mnpaE|v>>;m@?GzA8Rw zdwA?yTAsyoh356>MrL$w{HjCLl>|{Z%6nK^_UR{e4#EUH`~+I@55DCzz}*)%ysvtE zeLI$%?6@;{xSa@~8gcclaSq2dfX2QP$`kn2%7l6JrEkJb z(&4l6oukJfRL)CkuGmJWAg=9slB4gnH-pr4TRqE3Itq4*E@n7z~eu1d+7i zN%olouC8w>{o_BA6wQ;Zs<;|R29u->jB!IA2Gess&RLM1q1YlO>v^Unr>uvDhQ_}k z&oo{&uXsYC;T^JEQ_^?E^6Tq`*dy#Giygx`PEvW@HTv#Z^9C8O>=`jfD21PAWQW+~ z*&yotcPBDBrY*A@ZXE>g*mbL_Y2zQ+LYc^)MNs>M51uIXmd4)>R^B_&>f>!}Uw3$5`gPthl!Dslx(|l$-e^LJSXQ zq@_AA1IrbUu^2R{XqJWCgjKYWCViA9VagPFsdRAg=%nb)!|zE3+u2Phvn)_cWn^w(qd(5U|0l7lmBdXx%Abi30KGZT)1FMsaoVpG9s~sWHRQ zMis5N-u;>YjQ&)Co|BhsW55#2+T0UiE>rNdMyARnCdPXyZhkE<-yR%{S+RnT@7~Lr z&1g|#T-;sr(kNIl6J$MI6)VL{wigVmNcJ{QR=(2@KxZ(bOd77XanX8@Tl~vekX+Qm zaFsIWo5af>m;2(T(l=f0nj@LJEe7t#-#YQ_$&dErb`6_A@a7);%-kiqQ0{`6LF>=v z#BrT}57m>!@#WQd-YApB93@8JX#oaWpt}-x?*Cpz+;Ub{&bA?zLy{p*``cSZRO#jN zjFt}=42GXuQ=d*iKmDW_KpRee`z{A|iQC23)iumGdg@SfTCDH5DO?ReX)>wJKW+)D zfEkOG$blKs0D=XQs0Dj}B?=W8p}{lFFs@4z${JOx~O1 zQevN%Nx&FsBN&?w-fh&M<|tlC zdLTb{z}LjY%sj4~tXLemtow0$s>w85amme<-T@-B?nFx_m4@m6aKQ= zgKtNP){l~1ZQ$+r-JSLqy^ZNdE zfeC?!t#EeI5=ldjj@bgUX9ct(#7l>it$y}Wqy6vSYG*H$BL6NqFrN{yewm4oYZ3Ro zIaWtMaaK9=3RH{5PjNy9J;D&`dks*9b?;_2Cj~+*#;v;(3sf{z_yrz0HIk0fUT~&> zL-D&IE@pPtsyC(g5RqKAf!&=NS^ne*>eBDudG#(fEe{>1RlMDZ%3E0;`tG~6APgo# z>=KTpeq%9OQHo1O7C0~i4)(AEPYhK1D)_oboR^mOz>HtLEX8Ym91B0=l(N9HNvm8c zucXb5IE`*hzOv&j&|iJ;tK2BN!HAw_4Sl|j_#FxmB^qhh6!0kkv>=^}O;6t}{rtJ7 zcYhxjfhb=oUH_*s658ow-m-SlFJQhsC{jzci=o_jP+_uk66IpH@xUa&rSc_r}rO za?@e?18aPHc5f*Yd5D)+LgGqH?sz8UcbT3;O~saUStHx-;1*%>!5s*n6MDp9I{D8S zPElmE+RS*ulg5dBp6CrM_S-;Z>%Q1Y4xo9!%?CTyQEm*68~DcD_Ag+o>1i+i-nB$g z_$Hs@{-^4i9);p z6tZf@!yC--?Zgk|Z_UeX;7s+i>^bK0Tm3Qn<_Aj@+I=P9BJtDnmfmDY3dEXP=hR>u zZx=H^ttZs9GI-+HcfU75*zjy%8vt2B%wOtdD&)^MWn7jz=XGv-m@ zZT_vpG)+4ktqOY3-3=_&fb(YHC6~hdXX&o^2XZD(!|k1=vm2ct{|+W({rijVum#<| z2nl%9RBBo(&kLz=*W+^MBZ)-gKSNtZk~Slla-Pv_V&mGb;_H{N80-7GX~}76WiBLW z;-y0}ZW^FW<|eghc5oEK+&2<*Uz&d z>J6jrGPmVD0~XgO-)B9JIo!kUMsjXpGVb@?vgccz6quObxL+C{UPC@sJIOF4NJVHy zzijQZd@x?_&@_E?7XF>vVxY7%MmZvRZgJ5#V277Hf}wiLXv_jXvng!OGwy?>9C0C@T41twV9_#I*tzH2d4{$z4RMxZPg6Pwwa$t_L|fhhIbS- z?MIrt;54lEaUr!EJ=I@XaO7LhSA~k>HpB0T+RzBZdU$xyJ2BRmHx5*p@q6tq>0KvwfsSfSS48F=ZUrSd@kZGm4>?nrrH`X@ZG zZWuex`0UhLVwi;|^~o@+S^*&}EL`Tn<5Wf z23q!^b{BcVUYx&e09~MhnaS=OO?AY6KdP{O~5lZ~#T2*Sp4u)ngIPp0k>nZzz zUeSTu2t+I++BxKzjDZgARmn<`;TD-PZ9 zN&md(A+vmZ%N$t>3z_=ye8Qm8*8e$SeQZpa2R?;D?`~yq!wL>9^4n>CNWqzwav0aE z*1c;vEu@lrpKm(935grpex2(#{7VtcHaJ2*rXs!Sk|JPp?TdtqM1IMd*ab_7)7W?4 zB0$9H3@ZgR8j3Y;yk1(ApC1I*o&+D92!^JQ1S9WutHfL1V-MvS!HjElrw04TrGcD^ z^?={aU=#`vfq4)me`GULIlZZY^ZChj?!0iJ(j5`jlV=%*toj`G{|_Apuu+!1HnjkW zL61Tjrv!WhExyob{a#K`--_DtXg(~HM02P~Cr=Pnl(4!IznP?>ursgkNR}9T?mbhi z#Hl#>{jrg{u6-R&=v9zs>K!Y;{qXuj^)fl#^;UMzDdE~-tZGbL9Lm0lXN-s#e(-T8 z1_~ruz`1L`X=BXUL6pr&_O`Q~K`V8Tidw!p;fs|0mpWWjI~U0*F_pwo8ZJ9F5ci&l zRxQr7k{Z76W!hVDlcE2z6uk}1Ju1@mkKHVm=R~ay6X)v&@<-e|s_p_pWzB4|$LWnG z*IxnpmDxVwu(~oVViGH9JNdRb2Ac1RwUc~-tNWdCu#pa=Sb2Fe%N8b3<{0r;pQ`C% zJxC9V(ZM>A{UTI4mh%H4(36sC9%*z=8R-9k=IRfu8YJxPrVLaVAneP&0I zy1MG;U&_@vWdDTe@OsUQ-3yiorAn!fFRV>Cy)x%z3>T73(RY&koI0&I)|Hcca0S)% z-4HF}i-Y!kEy4RAS#%c=Wg&vA9?vkgiFH%sD`|gg51oqAOk%fS7#{K!2EA)R@Ex}G z^pjov?OB3WcW%F3)bL2=hEOBzJs&&7akk#~h5w}D`XrId6QW2goY=o`P9+8<_7|)D z(CgzxM9_yc`FO+B85pi!Eu)%KPg*4cZQQEBB8&>E{9pWHdhRc7nwcV~DB`uE^Jur!Uc&HKTu2MS#l58jXO!iXr4nX8HBpc| zd|l~BriviLYy4Z^6;tv^LFT~H*M}CE9G+zZ+0^&{@0S2YR0hb{&<}w_6R4gXw$fpb z7=CI1%iU445TAyr{jCBej-ZUMvZn9YfW~7YH#fA$*bxx=?oGto^~r7Zz{{*seHM}g z^$P8yQ-wd?`s=LltybUt90P+^iMVE_GB$+icz+R{BI%GEA78=Gm$UL#>|PqU3M_$b zY(A#jt-|=*ZAZmi&5|>A>HL3x&+t0)y3#{+{DTXCKwzw=ju-uC(=^9==go_oxnuvk zfFbWm>9K=IEBEU@PX`0oOra07Y-=kKH`qS Wo-ONyn<@OgUPVdcdEwJHAO0WBben_# literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s1_plan_chamfer.png b/examples/pcg_facade_tower/verify/renders/s1_plan_chamfer.png new file mode 100644 index 0000000000000000000000000000000000000000..b0f36cb8dd55e806b26e2964b42bebbf6dceb602 GIT binary patch literal 83490 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 m{V@uHLR)}GK<RoY=>!zrFvp7@EQ(fQ#J(3_0!v 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 literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s1_plan_l_shape.png b/examples/pcg_facade_tower/verify/renders/s1_plan_l_shape.png new file mode 100644 index 0000000000000000000000000000000000000000..0343cd95a7a0323ff0eb519cb78532085eda590b GIT binary patch literal 80766 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 MG=GcV{KuL91`VI9UjP6A literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s1_plan_rect.png b/examples/pcg_facade_tower/verify/renders/s1_plan_rect.png new file mode 100644 index 0000000000000000000000000000000000000000..58c88ca51f973123ac99f2373d9e3b1e319920c1 GIT binary patch literal 79364 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

{i6gG^4UN>vsiMo(L4Wesm^7`D%GiC9#|E$C&r8 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 literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s2_fin_bins.png b/examples/pcg_facade_tower/verify/renders/s2_fin_bins.png new file mode 100644 index 0000000000000000000000000000000000000000..1442acfbb8eced1be80e8233291ea478cc686f26 GIT binary patch literal 65612 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/ z3TKSs2lDEhEPNG0?4I8*)4O?ARJa_qAPeOMDAe+2!;5fWLjD_|@3c8{)Rm+OncnDN zcL7LbgX%nhd9+DgH-DWF_5x%#(Wf4q;O&;v^`97Ff6V=%6!nt!90kbez~Rulo+{N3 zSlCKr7*y?1NYe7+a3AFo;VeyR*#4Cet%%dSUfv)`fd%*gy3ysZyPIO_4sr?xuEu8E zO4PO~fHTShwl?DFz5|9)iQgst0PE+!Z@5Nc9`-^2)CM6CUI?u~K%HhV)&Pg!$919s zJ`k9<0N#p9vchESoCKk@-)V}XtAjTwA#?FPFXM}yul=iAElHdAL#e=V0|A@yN(!m@ z-pedNy8sFO4d&$sUcGE*R*R~QGo8`JNZh0-#|#z=7a7-31T$V1D=u}2O#*qAPJ__K z8kdM(R4A7-F}w}yK!j&eat^1(Gk3WHw{=zHQX>mFu{z{&I$*+{QN_^@JIcc7%&Eie zXb>AuIo$K?Ddv(smn7LuB-VPvm6%?-L@H(6hBQ42ZxsB=a|v<)=IfA^`j+kODsqw)W(vc6-Ve_Qni}fQ%FV2K`zuP%(e#*4=v1vmmqQw@VXhDE}<0Jn>C1y zVIVw60J3HDJ-tNlP0+8Xg?WM9-UoaNNxO);F#t3YexNMpegx*uabRE&{h7DgP5BD6U0ON>AU{|AOoRBw`Tx-< zG>E(7yRcBFMEcRA^T*d))Lm0`_4nUN$DeC}BQP~_M6$xfR4 zYPQqUaBebCr<6$WoOJ+TeFAK$Qa)18Rt^2YG79sjK{(?eh)HG!Ffz6DUkhgm=kU-X z)QAE=jQo}26qJM|PFaBi-uWwF_5-uoL7M%;pXV27dNI6lar=7YT0eh{wkNZSPQ+#n zl2b}kWbwSMYz4C~0-^H7e@jFG==mO;4)D;gX1nF<7fKVf9SZR*dHCx*p^h2V`^_4W zSA3`VV1#Mj{jEraSu4u!eZ2P)U37_1Cy3N9xb(+K(8F1y?*~?O-uN#Vj~hvu>--(! zdq_3@m<^^(V(lRdHE><>h!)) z^$x@mief-u=*_L&z&QGAW>iQ^?1YOfZ0+MM5er~c!`RVe@On-c_%$wSqlOjH`Q`B& zg%s|MD>oWAm_m2_31*af(fKh;a(J+(b~0%{yQ%ylDKu%nB|o%GpAU6Dbe~~RnXFrR zlCH6|)#9X|?sU`-4-RxbdnfWq_2MgocA(R31UpdjIQn1khTRuKoj(E=yj=U{m`9S5 zvGD^#Bx2_6e_e{Nw+hF3$6dks^xj(xMn`H=AuK6q2PsmYH^BuW5sNZfYgMQx8=p5+WP?ZT^P&AQL%nWa z2!bgHOjQ~vBmBm;2=Xqc5=+8l$&L4^Bn}RBc7?*`K z*#A7csW=+5eh?D}0Q}rNZKHjr^`=kZ^v9;hJhZs%^V;|9a6R<(CYdd$aPeS9@eUbM z@zJTNSn-Yb6UWi3$gn=QP1(LG#Y$>gYFwgQW+HZZw$p28-`M6G`E9Qpy23{FmN>$> zpO*neh}JKk?>I=^Fo#Kv3XSe*cl~VqvT&$N6>hwIH3+T#dyo4FA8&(gm`G(bKoZvV z^dm(xwEK3^Xo+ccq3Wz-i-EYw=<}*Al0sMc#@`C$gC2TJ4_jL>_FmG%*A zp(|(O0lRA8A58f@>vmDYPvSXMVX)d>U3`IvwqoEjFl`9x?DOrw+#*cA5yQUWzQ;EO zf{NXoAPC3^^JVe#1L0Cbp_zY?;Q`F2(ah7N6MEC{n4CKz!s5?RXa~X`%B$zU<^@m2r1HIuFge|Drqs)94G47c_lN+>0@YO;MEji>2#D4u*Z~^VpCrKMB zxxjWcoONxivB*K*W;7`MCkD+ex>#Y`U5L5Oy|sCI(at@Y&Hj8&NDx!PlrV5)LW-GD z;8?7xblMXh)xt|S6A|;dsNvrt$40wKe7f+e~(4)y_tDld`fHOrgY47Z?6 zka|NcWUpBua}SA{1!t-f+k4OqGI}=k2TvI`m3sHE2>U(pU^TT&yMm=4c~TB5>}pj& zDaA4B^no1WF@BX*rLc%sbj37UPVxL>Wo_YlLGz!-#KIvKpbzl@W-9ORY*#7%LKw7; z)1NrU*_#b;Pe+eaiRnR$!dRjeO_jZ6A7{@DofMr>iaKM`kIn?mN)(1Nm#=vq%)XAD z+8+o@)(OC^l4-GMP4d5N5y-PEw@`_SW;yr` zyY85lO%-A=S);>Fl0&Pq`?6Ow+Z`RY+Vek1mI}X%c>Odd8!gYS*we*9f7VO-)GnnR z(SuH}tJ|nD3+a#40(Xp_{b2nM1O-NFnbBJSi%O$-z8crw3cQl>xx|C{QS2raLiO8c z1=noGzNbn;*X#}3Jh{-cH{@G!U%MA*_Qr91*O-0QOvy|9+27fQec8e^7>H6t%U$>N z()|cu{a)-oqI-^T{^G&}tT;(o=V1{-`_Gq@Zij)$o<=u>4;1 z>**l%7x9rv=f^1|T%(Skn-5A}-w1DopZy}rq%7aWNEAd=1-GpqsKEpLcD9Fy+C_5X zKKXPIDYq17j&@14-2LM*C}Cc3)acHYVp@X9?@ht{+&4Hl`QGnYqUpJ9`s;oUdHw@X zP!(u!06P4nrws5P8Q2uiTq0b4Y7J99M;40G;yX(LWA-p)<0&UyQY`sY z#WCvo27k2Z_!hzK(9EoKsn-1v3t*UclE0nY{}vxg|6 z_M+K`59kPhTILsX^MAwk>?hav!3Da5`heP7{{!2bXZ%wrRVk+VP%m@~b<^xwM+XhQ zA85aMI6EnZZg#m6;zwRtKiu+deZW0o8RokQWO#p-cq$>yt|Ee3_(xnb)5pa)i zu2sD>3dHLYVBtC1=3H98#?ileY=|5OB!hyN_@k^;gpp2>Sy-nmA-B_$WXk3$d-teS+C9 zMLb5ujlH-{fR8TJeRn^x=%GA`{1`A&a6;T%K-CH}_p|>FR5L)8ts?Dw8izb{7W@(v zXZGp?cDA2a)oFH}WQgq}?YZQMe@g^3*8dchsLQw`z3+{(VrzEz)^rrJ#BwP_itf788sjHh9PQ2B*?Pyv;M|MMAHos28>cwgE zPYEGJezwT)-YqsUO+@H;Z_1lf6ww()^;-tZ8Iq6~li~!M)cctFX)xE;L>$OlM9b z$CezcIgz+@(#ZP+z3_0@4GzmTUX?@v2JG?lJt*n5YmftQh1;c~1A+22zxzm?`wE%R zJbQ7H6&2DBhGx&}NeHVts5frP#>{^E-WAixk2Be`J0+y~gA-uNl2*k4frhv>(@ zv`CQyHMrjI2und8lj5XAzY!h; z2AH&_3;JVCU`!K5>nZ)?6Bz_aSge!L;0_)siTtB7;36fl_Fr!$JD#$#= zkFD@MJ@=qCD*;ED71ljHAh=qKCy}TjFF=^;Rv*r}l6EBlAB@yFeIZ)Y7aa%y9w`Q? z{tc@G0y=?U>M^7#9&OC1OdG7oT#dD;>;5G%JihYO}~f^GbCgG+G)~$gj3wPw_$YoF+J|ZN*mR6Hf~+P@nwf9UQm)2n)m-ygaqXY za95`U@8xMTUzigrzx^mDwEdN-fubFiwOTbN&*q1JkK^1T_7H^pdzb^P`QZ2caSiTZ z7>te|itBE_LD6lldNBA|Md;tnV!nW^R4eR3U_$vbBh)W)6ZY7Fu`gex>@fyiUPqgL zqNifGHuKBkkOU%k0}%3dPx3Bt$by4+k>DlNL((aD(E+0DKd~wWOv5;j4c5iu<$Q$s z^=S%e3VOXK76okh2lYwe@1C;d65lG-S3|F!ydV`YH$pSYDg_ZY&`e@Efg37TEx!)NyUIDaD{*hS?G_e zXX_^jtwLR{+Ke7ebhYNU_QB}di^x(->pjGNZYei8wgQ^FpuB{mh&>U~cya**7g>+S zZ53L>;`t}tBzpH=0j{r&>mHmdJp%jRX|s@3Of*Bp@;~#Y0n$L{Lu5dkJAHoame=<- zx2)>;Ui?PNX;uD7lP)hKuLpx8{h9P%;NE{~G*psvOB|$2$Sy-*2gJUEE5Hk}P8o(D zHD@W0-77LDxCpAm=g32^@ppD5d_Pgt8EtKH3AK{zK;WI*DU(8(;WCj3S%np3NK$KF_F9*X-F<@{nm=ZN=E$7q&MuP6-)R= zA-G^QY%5DO1p^ctywjy+KH|-W4ySML-meCGtM7{ZEB@Or4#KiHh%23I(Szk1b}A9i zcX}*k%6EJN{j2y3i9qyV#{YK7kauK^AjD`#C|?2~^OxEaAnt_v?X_h|78KsW2P%^i zo0YAfw!z0nz5q29Kx>a=5odm|e1N{i4+Mz9B~J7Ptj$>M;p~U48R{!Rb7wLc54cee z=-8&XPIW!HrGve*zMSblqJlIK2GmsKLbysaL1 zJb&xfZN0$I46cNmeq!^!g@m@nbXEDtV(>o^aO6I!aSMefqcWvzbtJ(pjm;VAW78`C z{1wqNaiLeQqvV5gVJ_WY$6RmlUz!`rNO?BQ1Sv41piwsiefF{o5L*a`9+v#o006tF zEps7#ee}qENzntD{CP`z>b~xw>ahh?W(t6e3S~L(p0?vrw?3HsKSqqr;HqvSdAS!r zXnG>UMI`W>5rVUeK5p=s1I*t!Acs1&JJrHvF06QVg`nr78M8Y?PJ&!lqvGfOn=y<6v-A7pn#K$Q+WNuaIzZoanP5}Pz z1{g@R#7*1ee&(x~`1MyF;Lh{X8;WKD?P;c<$7L+}pRj2ZW%@eNLQbnXo5Rn!jK@d<7 z0#ZT`MQVVA8c0ZT7Vh8oo%`K;&%cL1kSC9M^R72*tvTnIV~l0Zj@C&Z3ptC@WDi2TV=@p@G*x~k_8cUu zv)#b~nom&7=?;)Bx&5)9wnv=b5B0y{V4yg~SSy_pi=VtL2GY3Kd2{BxNR=wt{OqzI zld9!ld(e_mIMLJ41Y+8x`n!&QTWZ{f`y9|%K+h42|G3{^*@pmLLIqCgq%B*L{<+h| z^~Y9}L$DioHe)FNk6+H7sShAum<_2M*NkW?9}vD303zf`Xpvs@mvUFo8>4~ta{FJ$ zvo5_{R(}Yxr{};D1(b6881n3eVW0gdDffgK<#?fF1We0M&jL58=RgsYyLh(!sC81= zolsSOqHhh{QYNBt>(D+k_55IX4utX)WIgixjonYJpGs5C-v|j%E)*6+5O8Qh}?>DQGby0 zP#<8d@_xQxJY&^zRUczYP6R>C|9qvGq(xMmr#~C^!k2|G$Ji~rwBQq;N79cTFjZI- z0a}2&y|<>?51$WEGBfMJj$X2K7Fj>%-()&4`i^kdet-i=@$#)tw~UAUu1R&&n6aZ$ z{lo5au`K?ZJs0(h{Hifymrf`i7o(hT)fIq_fCSa7(OSzY)Vuj|&LZ65?8VR3qgA7$#Ao@_@(wTuofIES0+h6B(T1AX-!%Yymx?kMb>i zX7_IYe?Zm308Owp0&qKRR@4t}$9RucsY-}zeGra{#lHgU;UOolRl5 zqQt<)lRaDEi7l7ZFL)H3$jps(o7LqY^0mdg8J`sZ01als#JOM7LnKj|LckFBm3Pq& zL3+G=%El7mX$2KteM(zYSDMayehj)@?w;r7y)a1zClb@MyyD*B=YO~V?CP` zr3SE9y8;n+HZz;~p~zw%A1c$~6sH~Ilrr2T*KC)IoCngHo%&nFyob{JWU?N%&%9o? z6p!afln`*Z_w>I@kWcf$z24XBKB6|7bIs#LEXk)iG-|YD#-9nACUY^MH)nl8lh8DZ zrXF7zG_f39Sy){8z=}^|h6%KtO+I%1r%vV1*I^2t@%9!(!J$_u2kZorOZrBVf`=iQ zn%=8WX9QVoqUwz8fac3<{MeY%*_`G;M-_Xrx))=4JL1Uu=j|WvyQ@L!yb@j0r`Y?K zd;|QiPwy(~z+YL*)?@!m#c6*(&b#<Yp-$!O8Cfe~P3)cBdW4O(=$N91Y4s%T;P1%!}DJV5QFXe`2 zug$Y5XrQ7&zml=qT&Dk*vx=5OFQ1oN(l^tMHG#6`LHS=uS`k1DE&1qGGA zU0mtJQ9BM}iHDqxX7R5jLJjM%9@OrW6!)#Dh1*kV>THv5-ziPp6?o)lq-}RNo0jB5 zsiX>+9%(0EcBOvzv9TQu7U5jFoTsF z`7xw+z8}X2NM1EYzBu8h=OPPvEe@#Q--(W@p_hm2oN%`uXC4F|W=jgg74KzNWr@8T z3~A8y^n9~a$)9_FK;Kk$`0{UX4N#@D!ZwG<4Q#EopsUKd>=A36Sqf9N~G?WaiD?1iv1Tic3(Md7Fh`s{N)?7MeP3$y_EOhiQ@Q0To~1v!s* zcAxU55ul4&|4zUE8;$+J%X6c!A(-9XE}Z3M-3B9RT~^EtL3f(9Va;>vUH)9FEARGp65@O>^lql_-Uo^U+5E*L~Eybb8QG)#+d8Qs3{~uWg zFtGA|4zh3zKPcO3mN0IM%if%&;VzS3N)JJQ$!6b^Cjd%$6mmbB1KXE_paFqW+;0#A z0zc>{Bq86Xq{WY#k9`Vh(DfX;cKC|Tg_I3Oei#|qax^qm@xkw#Yl;Pf-lV_uGt&GDs?!U^a~x)1RoaUDLpnyo`seqcw7CoKI1c}-63k2j_p6@) z`u9aV`a4+JvuV*{@t1g7dhTD05I&gv*DtQKcxvbF1QY;dm7TsNy0Lbl1qoyk2^Gcb zvxk4XG_iR@0c;CAxZa&Or&-b)d$LElOZmCc73uuX@-18WXmLS8so6T%?0;7)J-?z> z?M9=H))?ho3A+0Gk?r3?3;;ZN^bbPCFn~UGMM#YYtZ8{U=_=b+e~H30lFU4PKShJ9 zpCS^IMOD5$vvNZi?!Q?*7~n43y!v2;fOhb6pfS6`{r|#L{;eIHlj=UgKFuIW`p116 zb!pi`fp*T58vB>|&(+j{d?tmROPsbh~{xnl(g2j!>2zN$JK(Q>4 zFS0i(%6yIIF+C$D7OGiu7#ny(>g@hiPJpV;yW=XzPYf2>!*ltR6&En7mrh7;GN%F4 zWYsRa6kvYQiYKtxkEuyf9)Z%M+G7d(Rv>I9ph2KM0QR!q-}XKz2vY5V4Zw*D(J-vb z1{4;6)Mjr1gEiHUL%*d)`~0iSAMZ4pb6-o`TdU1=EpXM4eQ~W57`a4wc&eY$^lJl< z_fh?uFZSscO)@~ZWn!N`SDP&srVi?zDR$Yc++!T&mT2>f!)OWp#C=1reGqpOaxyt<~&KwpL@b5JJM-NaukIER>bAUOX^>O3xoS*-2|0(0t zT;1@O*>z()8epgf=y9Oy`v*5*+94G`T zD_kGoAr^A)KkxGa{#jd=u%eP?-N~SA0imP7TEbsmFhM;1QF=jMN(tyG+ZFZ@?c`^z z+f6u0+}0Jgi^Em-$KwkQO}#wyuSCgP3zU@FykO;(oE2#UxPzxC^6gJi*>K9US%3$w zj2u0uxw>wvqTH($@~*%Y%T239fVy5vgzsM|j?M+;xAwp1Yk|YV*PJr>o>tjp`oG&! zXm%=j9H1eoTmbz}FE~5!^2S?n^WyUJ6o&QSzq$%_F!UK&>yx0Y8d3!CeAPoaFEI>% zx-8^>HlO}2hN6LQ9dsn%M`AiD2|S4;=>3a9_WLtzG7@~VGwI8gB^pL&TtWxsyU<=;ENRHB3v|MGD4HICl;P@BonUsv|Oy(UgTv}{)a#xVcc zzJRCGm97$u(ZkO8d5vABSD~$(aERfqhuM{)aWgY3^@YD8lde&_<*P_XzVz%b3%1Nl zUy0QT z-E7^GO%9VEUUP{)9Ur^!TUl8o0228R5<%wV+H7HNpw))*p3&S7GyswL-`f+_G(cpqk+Qvq%5)uIu{* z=xYRJ2!CkEr^-UV>lGZp&=QmVe0a(`^1qYHe{t=?|0r&bf?Jb2c;y?_Uwi$%m5-LG zvEjkXeLVtemm=b^7tk^3;79!H!)lR9bvzBK+Tl%*LjFtozyt?>7NG zoxhboZ1Eq24&O%n`}h78{xAHTS6sOc|MznW2dm z(ot#2x85tgSpkw=vFSIzUuVOIyNc+>n(l2t$U&4Z;&j@lRNKc-`I|Wu0V!XdqI6{B zFc6aDUT^2*Y_XL6T1F0P4_&RBM+a%;k}w56|FM$Jme8C1Ye|uRdhvE*wKj8SPUhaZ z$kZZ_TY#f{pfxhK5}5loNf&h=vO_t`RWsr>f7MTHDHtn>q=UO)cZxt8X5TgECPWLCpS_D@rc#F-rgr7yW5fsa8X>wxybX8@?Se6zeOQ< zLM!vEPKdLyMfypH5h3?ti>VVf>B@`S*B?07g*gU&=9j;5`4b3_fY>gj#w@%U1yrP+%3RZIcD;rEYEyxoEp1s5?ddcCfaQyR^SSZQk^=0W6a<6zmn8F`F zCH<8>(z}_Z!_VA0^XBT?ygvZT_bdm?LsaX|$4HlB4}2_L__OB`OZRd@C|}rFlo-eY zW|i)i2EgRZl09$pcgMCBU8aO*T?W_Bc)#ukDS~?MyM=;5Z`*g$%U(TE-#98P32?qA zs}>E@$%()Q2KCu!o@7J&Abc)|Y23v8GSn|NeA(iiSljSCk0E(nUo6 z>mg`&zw%l(wLvZM``#2EDow>bB?(G!l?9;F@$-CiFj()BIGxm6N7l|suW}04ZARAG z#S)?tkDto&a&dJP)eiaWaQ!Zb`;%q`F(~YL+eghjIQ3xbKSZ*?YiY4MQ5QJZ`aWhk z+_VhYdBKl+=EfhTn=QcuzM(^a+R3IK{rO`DKUaiw6@}~chikWt#Vtz=48%@@+4>zc zyn#3@MeSi5GdO(Op$v7K_Sb!rY=E_Gj|oFvyVQ=;3spi3|J@G*oI8~ zf+&*GV-y^fyN+^v)uqQ@o8t-Nuz4PrJ4(AheF}qi$4KskCxw=Wea+EGCr>Z%u(E&E z{dwurZ5e+%JW!5qFAslm>g-6qXxz7{MZOLPNqf_G3zr^cX(#@J5)w0b#01x4eNQ=nvz1+G zwD7OFGXC-|RpG#Byc3FVkt?#-$B+szvTCFtL^m??idRt<`^^Q=mCFv+!~p<06s9BoQ~a*96WDc=;{}6KNBs z7Vt&n1IKwhi+odl`ObZ+h=TlfuPJh>xG+>QBy5JZGK@#f;{03GpEfB_h=KjuUG=8A_nb(q@6#WOylW}p7yf+RbgF);lvz<2CL_ZX18=cs$ zZfk4H+shSD(QrtAv?(cp@Hw#xQpP=rO^WHw^M`NCK&Z(qB)y*4N63)>wGr)bU7lMQ zyZN(N=}{wd$*{&_WzcZ+iLvD!weE^Z^0c# zdrl7SExg&gq7Ru3wa4T-Op0;{3)b(vPQ{TBQnINAGv`gLH+~7g=s%tRBtq6J`X^Q5 zcP^W)6!dS!KlpGG!@LF$AR9;3_8 z=k6`~VREGtpAJ_%F779cX5BhRWKAW&sBw_bpR1#!KJ$4PtrWh~J8Rq*MkI@3+=11Y-N3Lf9Pfn?wCib6;pV1_#y-D_r zjEu$8U}HMp0X(GRFvpl{>4d{qdQ`fo4JZ_Gl#F4_756zasVt_)((^Y_y38BGwp#ve zKa9l(3A{cYU^@L6%-Ne9EpW~M$pb|7TBNc0u1xJ3TiJk>VaB>e!#guMdwMm&b)?Ca zg5@%cWc6*~SvYutIHaPyyr!afH;;^J8Br`6+*-#MX11VeT*g=H9}py2@AZDA|#;@4>( zJvA-7|B3mg08W|N9@CB4`p8 zm{%K~Ip*o=HMq?_%dw-5>!)hlYHpWwxo7%!@20|bOLn=0YF>!VhBCWX@NzboUw9mAYtC3a znwO(tp;gf;Xs|BYYb=!DS>S}+tAzFYlS&L>$FuIT=PC(jF`kv$Bj%n|-h3fBLubZ& z+DL^^m_*k0Jg7T}6LhdeLj@;$=fnSKaN3f_pJjP`5tcd(tDFX zn=a>ZR#?Wq=9kd5mAQUD_A|dyRPDpR)20`qr{ZghaLZ+I1Sy(F9Jx0mg(KOKPl22S z912mj9XTo$IQ5uIg38X zjrq}K%MU`T!9^?m%2n^1`HLRUB9nq0ZRyIe#0e93?Z&(S?&5+ zIL&nLwNWO(t!6L!?2nl1yuslof`uj-6=m%!{=ZVjXQlR*sl5ZLV8Fy|@GzEsbe_F9 zh`)-k_hX#a36uW%{`~=l1SF7!*EHnk_MV26c+`pu#^+xeVz;T+?)94xV= zqRiFUh0dxF{8mRKcCIB|>md?O=kN6kV^v+(`%iKx8`pTyGl=x>nrH+(AF3e4by;%` z=(l%LoTyvdmI2FstgR|jB$G9;TKcjxV5<(V)#%&yq3;UMo2FEr7sge8L@J^f^(-1$ z3Lt-$7lzi-$ff#jR_4{X@`{Q@O#)-7qZB3}&l0UZyc5^0Lrz82&VIgHNDT;#;tCc) z&xjNNiefd6C1}yOM2GC+{4mm(K>P*+gc`f{SUtQ?* zFIN`X26F4n>#26@n9!ZXLZi|$?W0-S!0t`j&)E2Ske6Jxw?vIEVHNC6Tgh+)#8zIH z5yXFx3$H;XpfFpTyIdimn0~|dOCxM9Molng;-oYR*>j;kCCyQMwu=-eDRxE#TPpe62ZYR-if;BZIAhw|C3TCpN+pCV~ihIlDjA@K;%fA_$k`KYhQ~_Zh;PA|!uG zpD-5k|?b)qW2)%5)(Zbq}ml(~t+T2rIa47tlWW#c@#r&t% zhq8?R^!u#!wo)9WIN{M1;{qq+>?_;ThW3(&6dGnm_-uo_N&{DxjPk{*A(dMY$R3se z^BuN8ZK?eSdOxqOq64wii2aCBSxdcG~~7np~aKlt2|QF>tv+ihbN z^zlT6>AW#uEC%92@VEwM4r}ol3NfGIg`17`(`(5d54ERE3**RoQl-YhkybBLG`y1@ zY?UOFaoh6cxVcZPJxXXOrvCM!9|}em-4Je=lv059@l*^Ql|pW=S?t&zEO0`HdF;~5 z5hQVR-7-Xnf<|lCgDegnNDT%VYcM|4Ve_F1SWzpZ5RY#U*Xuma_4$o(&p#4Jy-i)W=J!_Kt{9X2*fV9&s?74uW4{o|=9VfJgF&}*35 z>@$@rctlxv&zz1^#LlI=hY@k07PMb`X2HFJg=ZPwUr+kB?oS@iwDl3 zw%TpF({SD{h5DWx(^R!F2}Gp*=)GQH;C~`%Q;%3tYOMeCr4UOQSg;|o7Rl9HweH!g z!H<0jAe^X}QazUBurni6!W>6@ZSePpOJ4*@IUxl#N{Xy4B1?%j=wxBLwM1xKtb&J) zif#yTNVf$%hhZO)FrJJIO+z(equ-CA_}rR}Po3pswMsZI8*!AltsARhKGgAhE0B(Q35DR0Vfpg^%>2s!8%&%?Zr0Oltu{SvK zE0vYJwtnPRROGJh`KTM{`4Mj5*ok%+9uCq3lhumR99llaSUq_0=M3Cz&57JYAz3 zrWe~8<#M87U0P`Vs(GHk$fWo6u2$VJ^H@`kwJ7hB8ItZ^0zXl38W-u3pvw9xc?!T# z^U4|yBG6cZZRkn{axD&~X#II1H%8J84wtf&n6ivJa%3M`A)xI-cV|--ZK^$(d%Nv> z4_B=4-Z!&2V630c0bmKEsR)<0AH(r8pmK3Z-v-aex^^Lxik;yJoCrwt5?Q|>cFCYs zH{aGIUu^HMww8|(f23nhYi2rKGFBQTP}_+NHKVx>M;CqP51%$6ql zt_CdEwrK4Y-EF2aj0)C3rb{NRl#NdkSL;LDx53hC{|3&3DGhKKjkgQgg$Tv98ad9i z7_PE9gmpyAvWm}LGwZM0SmVRNr>y3mi)wcB?HQKWE|sI0c9#F#xoCUSQLGo6pZdpN zjd2sT%oEl84L4$+@e^VU?>49dUwg%`rIBfhU%Pa*REPe!{PFF^Wq|?Vy)Sc5i?SSm z9Jxgy`u3Da`%US`x@TJ8TSZQnuUpg_RR|vhvXdAj0OGv454kNhtj$AMYo#!TB9XaW zL)`5S4Dk2o>H8CUHW)ZKn9I~(;+u(WQVPPcSOSQXXRu+s4UE+1RmMl5~J~R1=CL-%1NeP>G3bKF6OS|y6++*wDI)% z&y9xayLmbrt#DgVE8dWfkI_cHzWZmhyc%OSSTPLg>|BwbzXfXPLAuV4RA;Kf?hF~} z-!89~R;^897cU%k4PyVsu%O0 z58g=&oI7R6qp}dCyE>g}$9yM@d-!)%EF~a}C=Slfc!?)rbgCW4cAg5*>9hjloLNjf zy4|s2C=^1GS_{%`tZo*2Ep+Zmt$nRVL_yb8yX4d-3(xJwtv@10mD1Ds@0v+QB!vd7 zWGcJ5@$anF9_ioIqNa$Kqb9gOof)Grla^phf%(2gP`tQ8qikOXW^N#AW z(#@3rsw~|G)a~$5AL)>&1@7|d8?iW!iqj`Z&yh<_X=lK33-j+aSXCRr&iHI?ut(U| zJ$CZ@sd0iTm~BR@u=H3RtFyDSGu7Gs)f@H>vK$pnF@s6)iblWbe1zJnlw#8630VNF zV{Y`pG6Uz{*;b?WBAKeG7Zg>mx7uRV3{?UQN)i@sXfmeqdW zF@@P-RJzXC=qO@#pgh=PxCKIE*6`szI+e{&>l0Z4?K@B5A*I&SrFSm8@8e0e^BHg| zucbK?5ad3od+xWDYd(i$yIT*UB}VP=T%pq2+t0pTik$wt>-17vXFk-7{0hn#9@H7( zGwlT~xS`CI({x)+jW^V>Fa=VuTUUHaN`Ri4=cswir`ewy_TFFO6ftLBKF+EC`T2n~ zOjd}e<@sPXM{~@H!9xuO`Nz$*4ma~Yw}HI-`4`y;Nv14J@vFIX_W7?j9Lyf(@e4Xh8p)eCwe;XhuA z6N?r-$ozShildj6GdfpLhWS6^XSy?LK5qZTyFq!Mv>)Y;J$(qOi&O(sor(vz(&1{x zmLejc*9sh-K_6o>ClbP@H}(#&)yc+>O(o43`&djOTv`w5o>(H93@*_ITU*vnxy`gpQ{>0!vIc|SrOfQn_$+l76fwP>XI z4|||ay&1s-_vIyMX>G2)=l0MvS4h>_&UI%6^=V_!=5{;lYE0@G{yDbqjk&oD>R0N|7&cIG)+@+{*W6!s1Y6s71dX zH1xe5oOLHTsz}k1ik5JQe!~4^62#(xFcU~f8!S>wdj|pgc3Y0ajIhy_y-(A)W!w>$2~EqVL=N9_y!ZK z&&11(acWjW?tPmV7Za23)FF*+z-c5YKu+^IDR%4?G~2&>!wz31=T1tobIW}ZF`x+i zu0&~u9|qw)f{*lcgiN5Bl7k0?B44m~Hs5~MO>tv)zf>e2clAygUsd#0)b5mW+vcU7 z%hs5md?c>W=D8@9DNl&#MCFOFQ7@tCK)q+uplxtHacX`7tB9^&Wp4@7FG)rsZV|Ss za;IwZobS5CwynbghA%>B-&xB`vhVLL6704<)sq|UZ*3SBi?!Xh zdQT}+f}+)4JZ`2X2_86c^Ob3s!b=cBQ_R*=Aq2A3lRqok)Kb;}W z{Bl%HVZHlcW?c?rU5&V*2#-s(4 zPVtHLZfJ4O*oWw&lC{)$Dw2{X`&UKPiUa{UsU*evyKLYT2b~33U&Eh0c01QKDvVjm z+LFOvJYne>yUNN1dqgGen&>w_$CeahaU^3yY9+8LNXx;>{O$B{GiE-T1oj6&dJL%` z)$;K05E+9^hnGO3*LIG$p=?)f);u?!C$1N(q1df4zbCxcaw8^Wr>s}*CjW^p9d+ok~tUN>i-zN zk$*^-mAsp{?H6z*<4Wm7QHaCOca``I#K@RIK2#=oL_YyL-#v=j+K_T{n{Z&^|LMmZ z#xUb@!dMOSxCKGh&QdlS4Pd{Oyv`KnFLvV91(B!L*Oi_lcg9k6`iN5Re}+^+ch~r^ z;NY&&QT@_8hg+6bN8}?d*A`CmO$1V-6dOO_YUXoTvv#{-+c8AOBW2hnkPzk{O<^C{LYytY*h9T`(XqFU^77(2M~P`9cX zGoHRoQ0TE}DB>IK`AxT~2kC>QFrT#!!OpzJXL)kUKeBymV~C@D5_TI4_6-LJv{q9r z>r*NW93`Pwuoep0UD2Olp`G|37xI<48O^EoYcLqY1Q-EXF%SqGqctI6Df*AU&y?Kf z>d+k%G=bV48{`J=Xf5u|bCKdLyph*>#cecfRUZV1U@sZR`T+is;6yesNvcqhgUNAT z6cLa1)4m>e=O8`a=Q`|8*CDpQ5B9NdT^Swfw#7qW zAzeJ1eKI)(&Leg+h<(cAm;8u)9r@5|9PxA6UB{bX;=BgYSbo4DKPBk0h>^N_BY(6e zatWey3H4>V*HII!0IA)bd2=0bR_m-GpKavnbdFlmcE;d`iFAWPI_(#ZHSY|1t8w5Q z4}dXyp>e3qpEexLpXb2Xvj?N7i*g${n5K?UE;^qd96QSk6!(=$Z>m0T^cG&hp0oC30-Hg67d#^73U| zLOEF`YDosb-+dIfmR$b9wnED&Y?H5nls;1PuA?)nX1w9imQu0b(px?jHnhKmk8n+M zo#&>uc(j975K9}vWCo%UEcSrF)i;-X))kSczL^A_PrmKd-|rRRVIRNw+Yx-MZEPUS zS122t*9%uG`&!9%hgIOQ^Ks-%tE4ni68)EttH>aLYJ6&SzQ(i|u^YQUXRl^TsVW-r zIG_DM>5Btm6X&#sj|Q>rEzCpr4@(}upPHu=%Wzvd1K3oTrWdC)XEY$KvbeVsL!>4WZONgs2c}7^jhRvy@>(Dvo6#)xZn6y& zD5#xA7IQBZH<;5EiVj`tw3pnumJgNG4%pP=W3H&-c3ySB`nR@B%Yq3RtVJA-Rp~Qx z{!t}k2GlcJ{^?0Si#75e_-v+C*r>w8h?*0i_vLPtLc&Blq^0Ca-mP`e3so?egN3Zv z!01)vy&`Z1YM6qiYe&DU(j!jeAheCFptu;oPgcVSHujaSdFhc)2U~Z*T{{mC4wNJH zD$G86(3gF4;3974L5@bG+F09^??Y&Nb*z4#(JKD7&Y?v6(E`ZY;Gn0( zz_1u|^VrR;2%S9`YZ>FxXw;|7>mMP@r>AXXsMcR1aF_in3NZ(PF7}I0?8QTikMFEn z&1Zs-=>lrt^jl{HZZj^jwidzjEwlb|i{Rh+lR9e0=6%cr`hk-Uj-=wf1LlKtSgt5q zNJK`OX&Bq<;B&1^TU6oLQD7(mG(2tdVi8$fW`Gu@{{8$p1;J^m?(+c^*F))+mOt!1 z-Zi_P7Ouwq?&MM}|9o^~S~*|BO-aEAH)@}lE7OqN+Vx6JABElmh0oL$!FIbh0R?)q zjc2mFK6+}pK`k-An0VAu-bE=JA@q@4klDBDR+lU0bl#jV#U61h+TPmsB3AnkbhNKF zY!!etS#s!N|LR$q43T@rQzYBgm_Q9pWk!(q&{Q|AQa>#z8?`E z2PqM(T@1O7972o%F8!+VnjEJuz;`yJAZxEsT~3v~C!e9k`Lu(GrRds)Myb7_D8*na zEyjrO#!v+da4O6{E0)u|zR_4?1CHNEQQ)`em8@B{z= zr?!dBq&O9mZ(Eg_F=>TF)QVxw#Ak=`9(`+BK_Y!yO`(o8p@w6OeD8adHWiE`hZabA z5Vtq^u=K8?Q~WEKlN^tSk)739ZUYjp1CGiF^-C)G<%yX4`q{CVf!L|KiEC0wRU@}e zZN=0s>ww+2YT)?ZN(LguA=xnB+VKfVLyB1ws1O?TeRP6Rey0C|AB3h~QSf$pI?BLs%x78u%pc$g3|`~C2!mwR2l;QM16>#6VYN8Vj-_yp zXt?SX>*5kP<=zWkY5U_TBGp`LFZm(7kUy`QuN=oa(eeVSwGeH~pb0WQGH5Q7Y5}Qx zy!-Pk{XWn1(@58JDDO>ALs2whAt>T$LT@3Fe*eh3oMX_PaH*_?n;BvX3bK7XqE)AE z)SkOh4XZLcu@@ed#k=o`9mg`3Xv z@$D&)PoAU{hNOv{P>qMpEf9mR8hEM?d5Nkar=PSsCy4gtE{1@8rCrLV+Nm%407<5* z>!Td$#|>wEroS~Nx57*oWS$P-hLa7h$_Dpi4gh*b!HD;beCX4|0^3&BSC)ZfOYum8 z)^rQxC(k*a7XEZ^yBcfJ3-E#J_D>&fIA>`(4rV@-P409ee6SYn3S1`G9gAy~(=5pT zaPor0$9iCH{VCAF&`$2i*Q=FAjAyB=w-llI^I6tTPx}Ws>r7%N4n&_`02XnRNsduR zjbX<}^rOC6FX}#M|6!|lTU}Qv+II!ZIKp%H+vnpC?9>m_HU#WlI80^kKikd~La0BJ zBD@2tVE^!*2+tpXRe`#9z&vk^TC()GN^Z8YPG7||^ks&a<&WtmsjDvUXB`wEb9}5} zF)YvFe-aDFE}5rU#HQ|D_Xzx&IMQ@PhrP}4062>G)lo?vTe;5}k;+k7g79>iX~Cl+ z4x)btr6iZUFtL?DdPbGH5Cw1Efv9um37{;pooazrif5-Z{mb70lM^-&?`z+BrttnT z%>HnK)?OfA!{g5n+M9$VG3d*i=?*hdw3$m80crIU@o4y^cPY`FoE-r$)QUv_|po|;GY&q56i|zlFAX-d+GSi_9Np zq{+!<)ANbed1u-F>Q9$+kDpPz<(NiZsTE1t*Tntgofa?Tm77c=k>>4@RqBP_!B-wnivU!#_8kl`>_< z1obUN&A61#oj1yC__fBZb*A`Us@%h4D7#s7+g}Q;(`Jg8WHJ&k15aQM> z2$Tv?@+X}554`@pr3Z% zQ2)@-*wEOC#!AU0=61a$VXN(CRk>J3`u*>$3##|~J{vhY2Ekqg$RXcLU3E3oV*4lY z7`!LuXw{`3>Du75**bzDY=_uI3Ay z)W+eaR->G=#1AqZWHrHTuIS-cxcYX2i=A*=r1nmu!}U(STcSwnq#BxpaS(~HFyp!} z67BP$WNYeCT6zI+v%=ILD1XHJk+;FU1!Ol@j4#r@P|6GD>y{vd`w;gPMsW*-;u0MF z(q}RQvDp;k<)-{{Q3gGKm>r!2LW01RkcRe$ArN+1R*qoC)i~#)E*)!$S1Im?8&}6_y_w4;jehkpV@liFz@4{hBiuHC{sOrks#4 zG^I2DOL!wLkpD8~5Yd7&y&`C=hX?N~;rw^x5s8VkXe(L4 zJiXWj^7%3k%BnQoD zCK)7uyH4-uE@l3B=pgKxp6e^us2hhw~p?BlNSzC=zxC zR`um^iov^`u;49M-#HcKM~{b>M+Qon6co<3dh^R)huODJba<1q>K2ywo199*nJR9Z zB1CGS$0)5Q0+8ftAjB$1%_`v8A~DTFbD4OnV$Am^3n4`tYHp3w3=F8QO29Bdrncx$ zyl=-nRd{^=Va(OQLIIoVb#Xs{tl^Ejijc|}0;i(RR+-7Y?#voj7yZcj3(MKN>q^a92nhHR33g;50$GK9mauD&L$ zh4VPd6bhl=U*KbF{}fn`3;OpU=HiG8a^K|ZJJlw3U%Fb|<=FT?GKh>lW%7zf7=X31 z47#|Qw1^k=N0x9|QN~%VSypv!GpjW?I`N&_$oxx9{;G+r%cv>P&uz$q42|3$2QA*) z<4B}ULVX#5fg{0lG&~=zNCR4!qfL2z;f0Oxy+T4`T|ls32n%ehDH~4q9XYJko6=vU z;0^V}WYBuHryCIgVMmQDoAN#kPlud}yj3X9yU`TIpLovHt}*{2W>2a-*iPhx(~WQ_ zad%1)@QtdsLiRhxt3TkYa$Y1Kz^Mvb870WuH2SY7A;19C7@hS436Yw^m%0)VOL3&Y zUjdu+jDQlm8Xso|UuRcma|PJO4?zp;Qsn%NKiED>O}tH*sw!}+PurAS zJmx*G_x)i>K-lB8vx+D;cXB-QFA0yxcJ6wvbqiE&U2$<;K&-zOU!*J)OO9YkM*;{2 zSEY0@XJn*)`Fmk%dGI6s9Gt6#PfPq*w8So;W(}g3>L=*A7pA2#PJPO(pp8bG`jXNb zzj9)BR%qLs6OAB5EY@YFmY}svRpxd}l+jB>z+bJhu=h2dM~{b>AKu_@Ss;^ML6LwU zlA#>z#(%IR?Cn!U#7w9ZEx~jLn}c_9tf-wYnbI4rrqe?{q%npSQ8Pr=h7z=7G%O%N zT5d`ausC6?#lgOL#f6o{XE&Ape`qs+*5{_Osa5WdU)8P$^jU?JPPZY4A|?~7UC$L7 zAPmyyr4G04JKU}(Hyi%``}Rw~O4N=CnFQ>exCtvp?EH;Gp)yXVUhU;bF_+Q_4LYMl z&|Eq8^gWr5CPiy=t%Kt)F-8TweD16&x~h_PhC9(nEEq3v?Ai$0Zk?Zx0Utc#fvK(wl%c61XPikEb!)|BW-Nx z&bZC8Agx})sAKxgNjj2$d8}e%I<;|moJE^jpv$LlB4|rkXRFt!;QQwf-|w~A`+e_h8Hr@!;RvcY zaeceHTYD`?D`N#T-~zT4b+OIoCXU* z<9@FRZ(IaCRlEL8m-M;Qe2R6eC{)AJQ$Y+G7P8BNlXWJSi#pm8a+H*6;Ka>|lbb?! zUMf66l|hk`E8105 zl~a;Zs;jD*+XM)GPV~IJ_qG}`aHD)=)JERipi9@U^V(SZ!nsuzr|3KA zG{kER&S_))T2Zr?zo-b#HIF%gG`oGfIP}J|PlIed3Bfa6Te!wN1vhy#IgB|#je7az z&O(G}+}yxtwSW?-ydR?zelNp!{{fIZn*ox)Ma1wroDi?p`2cw|As^ z%sEb+r19aqbLPxLZj+(K%GPd8w99uRos~>`(Fi`B?alSM&1We;a#-tpizlaM-N}2frr*Fp7{Jd74j4Vt?f6b8U zl2r22#SfYc1*Zo7FZSL$s_C!W8;qiY2m*p4q97nbs7mi32uSFmOOsv$Nbdn@0so0VUEqArz5bLht4MqQ7VE%vyJzwPxNs^WIr&@{g`?a_T<&?E2YxUHbj+ z4}29|{FDq2(lBY0v`;n~RjD}&Be`u>y=Q~;fZwhkB5-@7cFPNxM&z9loF^^#EhxaW z1=JWzP@N~t`#y+F)LGqdA=RR!1~xX(Eh5>>9!&lVop@d@VcVnMC*ks}u?Nr5a-Y}z zhZ*wkP zt?4Up(MBZd{I0Ek4^8);uj4Nn6UMxx9`T@aK2SeY0TSMyp!m9sMrxEE5A;t^Z4l-> z=&R~RFQ!l%3z#o%fO{mjFQTjIW5iDmt$0&koy5w=+~pUEQ#tl+N-1r&-28ed(L9CS z>08)_A55OFH?E*QeCRJVH%-LtO*r-^;tXj8Ex*5JW1tOvJ)w~A>gE<7p9tUiB3gUC zr!)B?4*-zZo^u{EKH2F64DeTj7%-L5qBB%1ApGxRm_3KgK(*61J(i_S!pkaq87AgD zNyB+=^amUZEk1YP{kbkcX!Y*LXELGl&U%Ie@a@P94&(aIXm-Agsbn^Rt(qhBDDlZqw^Ho%eKMfcRRFxE4UNj>Je5eB?9bst+ zcG_?DPDb=y7hSs*9n23l>s$P(nlIw>QkWT;M#wijl9W)j>84<_l(7z9Z3!aNZ?gXZ z*kU(!G-A#dlJbEZ1(SnlaT9&jU|$KA-!n+w1K*~-;RLI*!{9t&T9YG!OW?VcGNsK! zf&`0@H(ASpK@(&l+XZS6zpa_$zG!#lxGX30{4|z%(MzD-GLN+HE&>X}ZtN+3hi&Kg zf#~w6C_^o+Awk?(2Rqz#tvW{1bN>A7Y+RAslU8uOZr{H?kMMFJGV)H-=@BM5Pk79= zNSjhfloMF*x#3<=#+8#VPLHZbB#!+~X3(^8&+~2iQ9~OPIY3l=T$lNqx!c@g$8aOf zNo@5G6s+~ht?=$dqm!QfvL*q#n6;*n$#nTiRNR#v^T#r|1nDtiSl2`{Y>Zd@@iOs1`JaTO9VwwuZ)N;_!7N z5^=sN;x9O3-_rZ7h66`>m*r|j2lU4mnNVgCQGR7wG4s)no0NBco~CwX1E)hlu#`}{?L7IiSfd01nRkKetzwyqX^tj9JqsFv{~mmeJexUu?1UE$Yw zAh|B0Ej#EMSs$OCI{zz-q$4Qc0bB3%J1$g}-mEd*!9Xts6PMG-H1n-+fc9rqMRpGy zQ}=4a@W;D7Wp|`CwaC6F<@GF-mFT6v-q-5x=xglzR8mt@Qe*M^(^IIe7QwaB!pjw} z3kgYF_bkYH(jcY9B^25FDhWT95Hb2^kFrBsp22sE5najgZ0QNkSr&5kTL2Jr- zB(3=f%1i|}=6>7|O&YsM^6+@S?;LWfex)Zy3E+j#8G%BK?voa^ek>21j>e`Mwmvv2 zAO8;e5)^hXwCdRqDwSy0`_xqgx1v0-gjiDvZh$@27B$C$7pFBh%e8E5Y|elzU(t7* zh9X%AN^3R9>2h)rm&iUMG4F&Wu}hATIW29|lj8`7DHA$Qp{{F-O0(NV!Q>$johYLs zQj`7-8V5)g?@wR#anD(E9-6t-P|+lx8K-Z4hm!>6tW^EDv`=ZK-Im>vj-E0(>s$dp zCEG9puI+wx6od|CD=p3Nc`xb`H~ze(JkHSsLv5o9RH;)i6UCf?h^`seFTR%wj2O`SL&erU^5(|s{EG05kM7Wc%6`*aWwQ;HIW zN?Xj`M!{_Bm6+2$5!XDt^opB{7Wh@njWoAYKU8nK-So+7xawXoD z=Hnlp+C`_VH!noXkclpL(x3a*itk6uVmkn#Ab^1E@SxQLU4JX~#gafe5$ulD>9^@G zGSXS^VeA9dDap%dM?%o55Q?=o)21G}mrHO{?ANEVd?*;X+AOiNV4-+t%6)*Fovo<5 zd9mM|M_q4;qtR!-WTY9sTZ4k>Xlfh!52=1W3NeSc;Bg zB|Z0Hj$sR=0xgQ{Z{4d^Gxjz&S<>!Bx?hMX`E+pevj$nvQ3-V^8( zZ#_5&@@RG$BSVxxIu#Q+^>$)9&iadJ-Hv@3q1As#_f5#vWCx|eQ&^yzMod= zAJ9BPEGz_`vw<3ZOb9s=Y0;4`ba)V_BK~@d26&MS zMk1a$!oJSNOyCE3%h&oVw~p!jmK6yf^fy+j)45D2zz?>WP${Z+*A_kd#T8Xu-Ai>* zkM5GRnN`fHq@Kjf#5kop=n-7ISwE8?ieYC+K zrTGn78;US`g5OS_QzZEEiYrBY{&U=f>$QameX!e%N7?74J!~0z^Jr?~EdSE_9%+tT z%xi&9(67}$1!|ptn_+z!tA&3T3SmZKB!BR5HcySH=^O(RVV%@vkZ5`r#(INThz(Pj zx)y1a#^d3j{OH!wqMBsgdOHD`L_>C^ZT}_0_ME;iGK9^i^F@;`4rjYH$E!Y4UKSQs zRwtG0aNpJIfP!)~_{8^E>8QUqt2O5VY>41mcN*_8S?$zsEtk6@_TMtr&x>ZZ2?@R^ zatUo8TG?$Yl6Y_RUz&vPugTMWUf7~H!VQj!IS+p9$Vlhe9#CCgvF&)5R=(d9=UivN zl~Ph#de+9T!)fqjWWjzH;j=bJ9V4`CSE0*y|EA>5XtPAxkqH2h>N9mJ|L%S~1Ubw> z+_?M^?TCOjZ7w6~T(qAWbER}9#Y5u z^mCkL*GEhJ;q+srd;H$THc9@?l4&XnD<+oxOH&5$uDEl5VRDk(fh8be&BH1KzL_1e zT{*V;&Cp}YVnqCdVR%GD=Ws%T&$&~P2Zc?Qe+dXgMMAJ62MDBeMgUZc*jybwzR}S~ zf91?rWHDEx+jl)F|KvSoyeOH1bhJjT>6u}K#GzZ={+9vz2c-P^g(LEyj<&(hHR2L zgYL@IgOj5~bx-~zAR>GGg~IQX8{7(y<52OU(-`AEH!CaUve9R(#W?@%GWsTbOt<@o zJTUTPfii~9=j(5oo01JBHHHwc?pJ(*!Po7Vn9L8{+ui@9PhrZeLEcR|`IrsSb zBYDudu2^!~_=%kgR|?LeR(#8GZU5Lx>G)tPvZrn~y_w{`*k@ikT5WBN$xtR0VIJ82@ItZ|!JD3%vH-==B7Z$8IuYVNCGPyY1HUXb&wjTGe3huIsp? z*rL}FkfYS<8`$B7-*4>&MC}j0ulV~F*(6KAGb^&z%gCni43(r0()Cavw^}vKim8p*Qy2`{6O^4WQ3@d&cf|cOT46N$gAZhyl_P1k?E@>-~Gi zM9k?@cM84NM*0hdM=4$Nl&lC?hgqL)G1G8gY?las5~7k{*=J+Yjn0$fj@!)%zS)Y8 z`_Ich#=%5YeYZB{yG2hw7ts4nZy!p}yl9~(?_WYD8hP$v7t-pjXMAx_lz12Thx{VW z+U>a0{D0|W_%ClNiR7%*_bkw*n~Wyxo-}7jZ2!*5_dk(P2MpqyuL35&Um8!LZIyJgt11gm`UvrcdQ}t3 zR@0ZSgI28tSUM!giH=VEvk(^8f?SQU@0c>$Cr-W3!tP4|$E@@ictBM1RgZ<>iTmG9 zSVc_-7f<&joi^TQp9 z_lI*we5o z?RiaYt(be_?Uie~d@s?aN!zcKZ-ljWPmc8KeSg0)8Q>B`SZed~({cEct4Onp)!B>v zF?;|Zg`$g##Q;8OKcAn`buvgB&V=li$lPVO!@ktt;+_+?IC!gmync>kkO@`ra9m3o z$mi0p{G4nUL?w~jB zA1h`@v`8uwPoh84x}XK~9KQupO}C8feRJctNh8(O!K;IAfz*Bj6aStfMnWg%+DS`4 zgi5J_)d6pN+=!c9T59obI{*wr+v>AVZ?s($|6soJ=JwRNAG)EzlqugG6mVvyHQG3` z@en!ahI1-`BR)VelF*S|ei;(!w`nZv!w9u5LqNto^^FT<+%HBSx8V|s&+8nJ;oNko zl8*S@Z#8sV?e`D7(-&QzHeoBXurGO}DP2J8 z&{SphZaR_%bI&DzZKTI8gL1FFr)YX(+jwf+rU%U96-0Oyw1~YM0Rl;#SD5wq z4kyh6UOrS7dJzT!^-dMT{hk~DE;*f;1RlHp|MMR^&=L)CzylU3V0&kC4OYBDptjgr z07>fN(-Ix@?$4j}9~o%tK_wn0V&;3e`IO_NYxs-RI`dot&)P>PNiUlA>L`HYp|M++ zTHDu__7#+ErCAxwyZPb_4cC-wIvIN}+JHa;NFkZI_kG3^%Y&iqdEMR5eSE5`cwa9x z!fAy3CE*XH zzw3I(&&te)V+EI?VEHPKPKg5kx3)rGu5zb+;VU^wgkfFTdmUr{V7$GGG$n-&<7WOk9`whE6IC5@~ggPy&8Nx z4BCrM|Bu|s|0=q_(5n8cIL`kPKG7og{)5Bi@~3|p>?jdL`23awsGOnw8vVt2 zW=?&8($;NDBs=g8adke*c9)o#2I`O7J^aJ%U!~>dg+SP)voW(qdPj`c{Q@C#$hf3DI*^}2KyCU z!4x(mSTl^!dYNFOCoITXLHr-@OR>(r3MHhVR9C;SN<76H1}ml&aQ^xEX^z}YEWCZS zF3*A{lmWSOHpIs!2s)+yJFygUApSW1Ey}%ZTm-wUGt2=fURIb&H^UXBM;urIm%JHX zo}^;)XIFcTDXgzt+-l)Sa4>l?BJe{*Ak$++g3ht8x5VdHdhR0e24XAXSe_+=%;r9n z#|5_n?TociN#}})-s-bd7Q7NqbMYOhCBX@LH@Enn$R5U6w4|Vpxi9{m+-!L1Z$r4h zd2g`7nN+~~)guPmKTqiB<#ho{XlMV24{EH|Sjd3+!)Yu0^~@>LrHjb~Tz;ag0iHXx z!xra&j=2AF34lRLgDS!B7WA-&k+niHf6F7+S~RClAsOmEur__#z|aR#2q;*K-+XXdozkr! zcRsbX@3{lUbehvpaQm7 ztT$PNgiG|DN#NGjGmy9XKj{n9Hk#D!Po=KmE5)7);)Qe$P!FG)qK$Ks&`7KR9zHD7u~SeeO%UXcotCDsmLwFOGUC1 z-+oco&T9R9MN%It+H^L=P474Qh4wUQtQ*)1(I~Qz$&-zN4(gxdlQ7_VOFd=mEf0c1 zSZ|XY$Q<$-&7C>o$flgGnCyDCwu@Kpi?4Vkz_3}bT6*2EC=x@ms{{%0*u^-x8XN)X zSN9_WB8r{kH-Sx5)K*OrkOE-yW%(O zKJZ#|k8VTpM!t%GXQwrWZ2IVz^Z6O-16{{asRrubBB5Qoj;rzjdV!QiBZaDs@lTef|9E zVeiB^-Sul#39z>YHs2i)n(XX4=A3vpB9#|k=!tHADm2iWTAbg&GIZ_4liq3@U29|o z*Q6pLj3zAHEqrSRB9C~^Iw>X_+a^7g1=HHYex;>#8%46|?_?y2G4r=p$_i1jg24rj z)LTUbzLxjvO%QBwp7=3~lSNk%vqf**FFm6l*BAj{RnSA=##P0a^Jl~_^Tny_ zJ-;!M#;faLQ?KT&My7K&v>8?UGzmh=%HB1m-R}C~FuoVYP_;QHG*`Lxyl|! zRrDS#GF9jd24aK8rAG>0*BZ2HP+?U1G(lhb zvDvzyXTkj1Z-iRqs3dREi!L3JPmk`uu;2}nA^1A;qF;&KMmH&VOzUR`P1r3SU5U>V z8By)n{GJ~~7V%nSKjxfEYHk1quUxf?4}dJ1ImMJ?(lPJw`IEgxiu9s>fz+2g7Zusm zTtE0&K%h(!TW3P?Cw^Dq%m$8WULJ+2)XyVXP5lu2M!}ZN=A|)awS(C!U;9h61R>CpS9{TBqzSYrpP!+vwp8= zFtT8*XuwtG2I3~Yh_x)tko7K~D=eyElW}El=mm2y1yO$gSaQ5uXq83i%bdA3tY;Z4 z8ByR`Z)wq}(bE63w%Ix*ZNc}aOM-YVo527TH@%qDNR+i0Lu4aX9M`46W@_%2Ordza zwRa!qvM(Gch09L*b|GP_4GPzfUaGUWb!tHnLQ%{b`7;^)a45c*D~fgDe&gG+U!}VS z>}p2p>Oh()qJ&LR5!ZM<@`S2FP&vY$tF{=`J>r29`>r9ql$`M5vE2&o<@LSPY}MD7 z#gp#~7H4PG)nqpe+B8$1EGgPE`}K3|FG!@IpCm!T-UL#JuIaxNF7G+zx|oLUm3!r! z;4b=`nk0#G-+OE3_;)+`2(=SLY4CpGRGlB>9^M7hOIkkHP}J9wt#j&}-Yt0&)K8iL zK0RKo!vqvUFv~vbw;V~|SiC&OS6S&Pe5+RK8_`7-a*@&Wqd52-2H&PK*ECgZexpV> znUWGP*^X@?3tZ(O!nVJ1V@2^fOSu;)-aE#?JV+IAI#6bQoUj&kc6~#x*sb*-YRR`9S~yHr)$_#>2|u(jsgbnN7v zTrAoR*pbnjM0~HXANo5VuPH%CTr*1bx}AfX+6uB*37Buk6I}LZid`&Z<6a4>xD^H~ zdLbm{eDL1&an9|16~Yx0J=6?ud-Q#Wm)aSkCGpTvl;OQSt@x1f>`ev&!tbv_R_!P# zxrZMjU@usNe?Z#o+4Fxi9fboIt|h^Y>n%*-dcoKjB2C%Lj`ZjuGhZuFLUKY~WmW;; zd%E_<54I%l@%bAyvFul-Fw#E5?6O!OypN6jx)vgVgkI#u(lZvrX0kIb1k~(WA`<#z z9_5}fRd$uJJM^)i6LTc3gIb-Yy^r997>EUAJ$n~uz3l$+lLDJDS0J3ku6|N}fF>0Z zEWvbd<-}?HT|_01NAuSvkB12`vO+FJS2sT)nB|k-9Iq(+J}SAlr%IA6m2xasJ*oq6 z96+aZf!AJXfEU=RlVbf~F#-HwBnM_ak|9*A_OP>(qi;kK+AR`MysQy_fwmt|11Jyn z2@>gu*pY?hdpnFCZ*vw=X7?{lR!5?Lg;G%FtG_A>DBumlKc*+*&_CKZU?;l!|4O6w zOzsOEsW=h=CCW-YcR9NhK>Cl`lQwv7^D6gF`7j#bF@FpVZXcjUbRsXW)7UvyR4FKr zAj#_t1kMB2bz2L22|#~!zjBr2QXMi{L8s{!rzdJ?XA8D8mHhq!PsJ8I0Dc#~Cnqz4 zJGqvka^-zT|DOsAc0gs=dFNTVm?71#^K=!kUdKO#6(F^QPD@f zx~ghGpsEw4gyB(MP=wfEgXsd!BL7aTrb>youYRiz&JEv<3S?$xR!roMVW}6%u8?Yh zAL!itczD|)IczxFw5Ogpg2u%tELm^i1Y7m537LDNQVM)#<9N9 z?A5jeLn!|@{5BA?w}2zN7W74p^Lq1anzWyw8Ur^LtH%Vz4UG&-lrY2vPL8T#9^glnm0K~eAfXj;+ ze+fZ1--!L;mXH3t3>j)D>0Pb%&ATEFKUoVDvQouaE0YWu`xI&~pHlv#rqO#i!H2(Q zO}oIG%O2h8o>R)`@m#EcPdYC&hGtoD#&uskqW!xpRDkmfFb1M1os|h=SC0D zsu>CUYf&Ag_?TCK*gC5L6I|ah`>VcC1*`_%yn4j@f0GEG67NG{K z9H6nT$Ci9bcV5p5j-F-1_S$R9zl+iXq^AoQa!v!FodUQjf}sT!bwp+G_y*R>w)hQ_h|(tv=6ac9{lKZ_ksyV#diRr*lGz|UoarCOs^0PemOuX(-Tb_dOy ziA76RhForgtcdm8zQ*x}ESEOmr8CM^L(ShHw%BiypF{gap(Bb<`-w`|Y9B_a$*S)i zQs*K%qgaZ)5}~M_tC0tBGIAFbFYpfNyi2&qqg($Z>(}S@qTq?e$lp+iGOzTUtf!%0 zkRcdJB|Erg$AqMWs5SaCb?-yHaYhrl)iBJVXW45sw*f;$3W70(x6x7OoKINN_U!#S z88x1zuBmD`=t|&M=aMM%e3lnO)wZ4uTbzxg^ESlc)?JmGzex{ zzateM2Qv0m|6rsZ!tbCZt=Gx*t7?Lql|lPlR!HwIWUMVUa^~fEnDm(JNZ=i66Z4A)Yi!zS4GEBboV#j@|4oRINdqjj1971Z1EEjChnux2em z_ZR9#A}Yu12Cbh!ysM!K#!@em6z_P=;^O(`zMZ0UMAI(QxC>ZVX|x&Sd?8A(#|r>E zmidXodbC2Ag^ew-n|VCf=t`m&k}q|4o7Q8!WWsKxK)26uJiebOzC_Y*!p4V7iv!mb zZOGyq%O*aZwqBZt#zy*$To*TBHea$8WM@Y3X!KpY_!@wa_F!lDT3Za*7FL`0E?etkv!)wc$wPdlYVl_bm66XQg;t{{> zZv!nOh(_{&fBv6w3j8~(gxrh~ahp=TF&1Z8opm?4aZH)*gTvIj&>xHrC)cpX)m@VZ zckXyCT-=BinanJDHON@rKF-}C9Q7lg6{7cbaXQrh1_O$5^b>3 z0Icb+;m+EA4YeK@9+*FOs~iFCcTk)@X2Ofil8taV1CrV!zWr@fbK;vFtL*`l@T%P&0?jD2q zI?NBpOR1h2SzKpdnb6NAWJF3ndhX3M8w!lR81~(IwD0rbXm(@4u(%sv#PWE~p!sfZ z#fqMHdd+Hg>GNtE*tO#j{3vu`hZ( z**1pZx;%7ll4ouEkxta4SDEITmJ2gqh|n{cUMRP^1Q+H5SW?L@=J{s9J+YS}$PMp| zXJF)qJlurZK)HGJ+#?>Un$BlTX_Q;*^hiVkOn$bnzOCx$dw6M%?c!o(Ap={=>*zLt zl{;Njeo<4szGvd``Zm&f+AdwveI6h4gk7cDTAYnzV&3)hF;T#5ij27;^yTL=)hYMG zt!Xm8ga6Ls0Wc43iaYiLJ2houI-M%>nl5I_xNN=d%fY|w4v(Ux!QkiZ)yXRfVC-^W$dM z4F?eAXuH>UcEj>nERxvgdpOv|t$${Ix1~s5&taW6i-o$ky|kV86Y(BVU=GdFFBq!5 z5c8y(+bvk_1)*kUnbo8plr;!AkEIS0C?fGh3oZLiYfm*6?g#Z?HhtBHm= zHo4d?9LXcx70$n-0JKgKfhLq3sl2z^)s<=RYim#i@LUGG>na<2;Pl7rz#vjzc8A7< zk61m{>bQ`P-I!uKi$9**=oAl?-0WQtveHPX#EOi+TuF#%f+!Ru)!Fk*s{gJ#vO^+p zG5XXkCw} zP1GT)`6-bUJG1s`tlC~hPqt?L#%FZ&-qSLVuAW{Z!V6xsHcs=gts zBwf#&Uve7fkyRE;+-JYwwp)Otte;($p6auC)nfMtPim2R=lscqahw&<0p%|&A^_tr z{=cADjk-GDUO1LOs|o~^1g>#j3}W9>81RM?x)=@qJOxI&Di8Qc)QE^sE%yBFb~M0u zwPj(OoxvW{e=@UG_zcRXaW^*NS*L)Xgbc*yZg+DsitWjzO!|LmQm(jidvvbt3n8j* z^Qx@Mz%Ob~s7Rvk31?Ta-^MHXuB`sZ=>90~Gx_GZPJiX9L3g-NF7KG{tt$a%p_2X= z3$n{!YX6997IO;NZVrh|#5d#9k5?-&J9;j8J?Yyx$29(x?L&Iil)8a~r$8}_3eW89 zhM&TXYTXKQ0&$9uM5uebdr(Ru)QgT6@jQSP+dcU)jM*dkiGL5y-AG-(*t;BRn}D%s4AUZgAZqz*av{y%v;_|!ii}hj3`qKHr|mCO z``fxp{ta`GvQBn50D|e@T}@7r61LFJP6o4^BJ=Ok(JEqF2LlA{Yb#_|7N2F(|Ks0r ztAt@tB{l0#OMY?Zg7=~l5ziY;-y8mT)b=pY{~v{r6w^UH>}6}R7@EZn#54jvVTr3p zod4(k-Tx(i%m3Un^slM>w~hz-cmA(`GjY(r{BOR0$q)qkH;w;i-S8=jkOgDp;xmv} zJN48>@Ii~*2PiAjUY|H?DHPgS%`xEGl#4*Y24ba}W&b*GABWuyhC(~lY%IoFD3~pV zItAD}F{zX!GSt$~znaJ<6I^&aF9^TfhT)oW=PMg6o858-COLc)M&-sGE|t9g|HLey z$QE$+-4OaGSc#V8DN&XUkLJtUZ1iHbs|T;mU$vMz-epwx&?ULnSJc7WWi;d!{aWzcWpq3aJ1;Iw z1w~0?N?fsvx%z=;;eX8$q;C;AiDdU^h!W|yhh+9g-M%ht-)Y`mmrp9ywbJ*ql6N`G zjBS-yJ?Np_Pk7E)m%6k~Lngl0qrcuT@??jDhE(eOZ*)?Nh=MY$gnv&&U@IZ%r+Xrw zMG`UMC!+&3n8c4i_B?&6_U|ftsIYfJ6lMMoriOp^SHvdy4p#~BRo@^&(vQ6GADy=q zp%r3w1Zuh2^CwQ`mAs{10_DgE zA0E(60v^y^3~GNBY8}e^oeqAoDgVF?0mCk2z|ZJ>R%a$;i~x0OH0vS+r$sw6m@h5l z7EqKzc%y|Nr*Cn;X}>W}MI@Z{qRq@j8>wds`*scGEThs99qFF-JBxiDQ-1qEuIk=qm#El0n!`LJKDtROwS>2-yfS*k*7%y z?s;DDg6KcNQz6rB6!SNL`as(g^vGj;kc!E7?h7%!Jjd)Jm>?tvZE_Wjev-R(_GzFM z7?S?NPAfH2%nu7R0OsDC@t<((wuhHMqr@C#F9?br1C5(6Zcc!7RW7RrZsyvBE|LlV z(~F6MddatKf;4fKLTtT99WdM?_l10+CIlf?4kv5nG3RL!*@_vd$0nHND# zAvp*&r0MdK^cv?k2j}G^XuOCZz}|LfFDRXrsO-orUM-BcuIzoi8WOTvI+z$tG|&c& zdj4m-E)kH5UVj~+HYB~2rS@a`%PgkzCh-+_lb-;8IwkybAm7PNgG&>Mvbu$GcBanh z>P_3Yqs5$y$)!gcUjVagxfyNx9(cRdipY~K;uq`jj&OZClJ*`E_M<&4w{5Z|R^XzV z;t|2cMPenw8j4p)y+!lGDl9DIVoIAfni;}t`KpN&Hu<`(h;(f2*A5ZraC8oSuL!*uXoNET; zqliKJKEeeh9Sx_}t<1#c;;` z;u-tLry~X~Q6_f*fC>Oz|J=QJ3ISg!8NB8WRGS1ouZnm{a+;dX-rV34+WO8E53MhC zEK?y1YxQq7CYsqlW{Q3B#W>@lXW*kB3+-;w{9(Q|8zX5{VcO==wEX})=RS5i{v_3c zRL9tFx6FT+o#7i$Cq(G=ujed$nYVd_E^Zm{2`FiD&CbpJoeoq{{T0D(S~0peel#BG z02H)gzbLF)QagDx6GpF+Az?UB{Z&r<(*@JW$ge{_938t13i$O1cM=jt=WPve4&%d4 z9pLv7x7jCjgIw~D-^2JmU^^3_Drq7$g@wy41Y{@6I?aVPFTcppUF_-Nc7q)d{nPzO z7HlO_HPi{DY6mD=V7r%2eejL7ufDu_YS!+WPxiutq$g$sYc6T;k(|k=g|6H?T*v^t zS0lS`xPM*HW{Y+;=`gFUv=X^#5_uBcu_lEXK(?P)k?W27lXQaCkTGcz3e!)=WNHELyBAc9x>F)L^2+YGg8W8^XLGfy$>V_! zT>!>{CSZBPat><%_l%FEb)%F}H(^bVCiKQ@rG33R@V6rAq3d>b^ZcXIr@G-UP2dh0 zyRB8XFt>1=l-Zea*Dhc1?AuTw-nV#S3iponlI=U)>|wzNm8Ez~y(#gv>Vw}uJW^fz zg?q%dYpIP6nw!tGtdmFSZkJrzk(^|70j-!NTkcOqI#bd_zb=F1;;<*(F<}iHH*Luc zp+ZFrH%?6ZB(V}EEsXyc^CNrAXOLk|OYr)4#qGES` z8uIodjEr3RY{fXsrKfRsF7aH{$9>oM{74>*N3FGCt=m`v{JT(%11uogR@$U6q8UoY z8e4=wB_s7Mc@hdifw$FE?b>(i8zaactkaH5-%MO)oohIUFi24SqF|W6!$BK&p%bw_ zWJ!N03k|PyHkstmzLuu>BEF2dF}{fp=^GlmzIq?!YSR%&*mM$?k;?fz(FgZtG!T1e4nu{XaURf;**?O^Qw|J z4d3@F$D*d*vFt5HUk-Ti_Hl4ON&$Ao@NJ)T@w?{;m=zQZw$M{hXsD{{xk->B&^4L> zV@uz&$N3wFJviQ|7*h}3S~jV(?_3~j15!7%huz^2P1d_4R|xMcuyl3r2(9>Smvfv)k%lF=;dWR2bk5~o)< z_0ZfN`skXW5w29Q&&ht+`K?PU3+dAs`Ww5V`yClXn?4Nu9+*PdvnjUC5YECra-u7K z{>^Hgm1~-ncBf>+e4JD_6=zPk(^OLGCM+Awo*9|@#3tWackq3j)(vx=6`cKqM9jSS z<`>~Q75SVWv?#blx&CBYmgdOyvq@YYjebg=jnP|%yCgRC>5#`BgLYNx#Y~myH`E{n z=9NWw|I%{OY!Vgqk91y7Cp~;E19qVb3>xbhiq2Yo3ne}JNfq(#lapfg>zeL|V`cv6 zOqALD*Q5M&KiQEex4ChJed3ny>Shuj>#WC9lZ6%aRZiNM4yngp98w=T&Hu7-v76_B z;oeb?88tZ2h}a(x4p1wn=<|B$VFgvhF|d_|exsv-Y{LrKT4yySB}Vl@;4uXg@KZ zvHWe@{BFIcFbCzHG62Ekr-APIynI#b%y;(_x6IK($@R_nS(bJ9Z#rXP|KH#IeA=l& z_K)z*Z8}7;F3qKjuV-(*a_N?q$#U|t2$3Y`0CQqr8G@7tIx*}(o+K-kJC~Zhw%#S> z0Zaq+^)hdYrI+ytt;K0?6U_Y=%IxfAL|1}S6Tl8->a;#M_OgyhBZV;(Us~5%A^6iP2iBw@4mZ$gjfZAA z9klD?+1ShMVK$}rp0tRPTd{g{x2Ijv!BplV?9v+@f4%!^gR;Vs1h30Z28z}IV+DO{KlKta2`kn?#Tj!R3t<~FlKQu5ZsU!s2^Q{> zhJr4Z0x3&%bk3ZPOAVE4r0p|K&#%Wr9&fj9Bv9Ed(~xGvMiZs z_kDW1oTI1)DLiEepi}r3TrEp%Xb)pzMp+;S3exd4rKQ_)-uUn{sTNZ6k2rC>n3!ad z{x+zwK=&cJCIE=9fcLB|UjfWXiRskWwt^Bh@GVKwzZ>+v-J=!x-Qio85IcS&D!I0|#(w8j zJv{{~z}Y+4YC`7n35}{`vdV3Q<3c%8)jbDNUa=P2V;|(C$;}hcNMuX_x&5d))YL>S zh?H0u63`DEkW{quqAh6ziC zw>D!RO*ld+W3PhRb^7S}`R~(ZcEXtA`+SUXkb}#B)}))!Wz>Ry=UZpsK7!jnnwL#n zJ)bK>BqX%WR(NH=_u#5$Yd|La)-|@ov{i_8|DkdB1LejWH;l%=g7Y(6e!gajnzAt! zx*y(_?PAsAy%jE>=f87S(_CNYJuTJxB;EU0U(6(&C1W}h!Q*>I$&zu_b%PrKM#zO0 z`dh4F9h2s@2MM0I-CTjF~xq+<*0W$OC2%t-wd(J*n4RQ zct+XEK8Y=)P@@Zon-cTI1mWwe>3E=$<3NY%N7h_jKKLYJAtT9me9ULPDkD#Ht;dr0 z0@7;TXLWa&w#@(NN7#DEgV_|I8svna%7drQnj-PZ;&$y*bZ6W78j@S%Rl}v2=8?X0 zd@!Yo1Z)Ji$HvJW*L`F>tunsI(W0#oMe8+X-OG9y#HWRlu#yX zZx2;hWhHUGI)Df8fUfDB`IHF&03-uFBIf|C0gwH`3tVpsE$x)gLKGqXG^mtj!Fb0I zTw`9jQX#+IW62|be|Oh!|GYBK2H$wv4rHryp|?5+>AlUhb_2|L>OA`z;OA3Q#{Qdi zy8_17WU|Ef#z*Kk7M#bPXKyFa!Y2W6j|7=Qv4xY!(?F?8_RU`|JqEr@`>K-14O3HF zDIN56Q~Dm|HoU}m<}1I0HmiLl{ms3 z`_GI^KNUleAAo{dUb}M(8D|}4v?Pf;5|6+*>yW99L+{D;MrnEZ zZZmV2F;R!Znv~8$b}h}T-^!JRb@~8!6MFNuD*@752_yyp0K>AG?PSDWK?Zk*Ky6-W z>&yP$nonF!pGvEM|Mz{UTRoQSmh{{ieeIG^0|0%Mt(L0@pBe~0!jm}WbiDI93K3i} zE6n4s0)F$Ep(2+-9c#%|xYDrNN#7_6^VdjR{$8-nbx=xfIuV>EsXtNeWMRL)h4RSn zG9K@($>y*6EKvb`rRP!z&NA{|i35N#d=hsAcQYGU+tYpUf^$(Z%h`JXjM=ZFZf4T( zw%s%!n{<3{Lh^ij`SYgeLX0(#e{PF)=`t)F(6&nRF*$R04Bh!%RrZZ@s9@0Sd_SA~ zR}%HqyZOP1xe@?cZN9`B7&u;YIfCAZDHw=__1kbfADKWV2ryF*xp^B_f8vrj+^K2| zjiMVsuaLAZ)o(>a09D-^@;LRe4kCs+Q+3r9MJUeNT!z;jI5O3=DpP-DdBee`Y0)W{ z^k3V;NlBrb+bfQG|D&<<4r*$9`#p+^dPJ~`2&jmPh!JVhJ)k08L29H*5kpa0fB>l`dKq7=*La%`Y0wII|xy$o=@64Td-goBaFNR^rp1s#z>nY#o z^R+pKeQRelcj)a9HY>V${Ub`Ha_Vcd#{>@~P0ts1H9;9`{)1K$wt*bM*x}8Q@#yqN zA^xETdOc(7roR2fH8SA?QVe*ItzYulVCp+UZh2MRGTxfD{LkN^kU#(&O2dDyJDr`R za_(4HL$cD@B$Xg#nNA#})}NK<(N*D=saF13#mdUz^vkNvSdr|+%}9(a?gDuWzY^Tv<)q3s?CeKeVPJPgB;c2veR&+P*jj>c z(gjIMXSdj6f981`O#_#*tko4yR(|ftZoAO$w;)#jwS=C>udy3Qg3{9L?hWG~yA^_) zCWWJHc2^SpW)9$zm3nS^a{>mW~EYB)&SA5W!&2|f9acA`R0H#E-=3gnta`(TDEGdgm$lEoxMkYQ z{AHofs1fOsdM2N<@VnuZ>hkrk0dWTbkAy@5{ucq}YhPD{HWn7V^X{>xiFK2?4`QH+ zZMkXpu19%>p7tk|?%IEX^=lZdwf0-u4vGQ*jZ?>4-Ec_=VaMHpY-QqQZ0H>tHs ztE??*fcB;|y8>M~xfLX)B5E7C=eLyIz~ZfuzG{NY!sp@h%JF$}iGD{lRt`r8DXGe! zQVA~Y`=`H?&rl&Jm}LY+Wyjmgco)`ej;e}MUlPvFvWNXpKh=D0eVC@;J|FBW^9YMs zW+^hmXP7zYa0ft@36jzMQtW1{RvGZhyTF2ct+KFiu=-~^j_OmrOwn0urug-FS)Umd zQGb(J;mr-Jvnk80sTune#nIwBE)1d@B<{JJgA}{*Js(ZJxw$vDn1K-Pm4#K&zM#yJ_UF z7YPMQV;1vQTM3_Tv$jMYA}_f=f;Wm#qL{9b%_y$TRj8~hj@ z20`3s$y}m`%6IU~v*^;5#iBBkcYJ7buk~u$=-4yuoIPu*Hh=%J1^`RGh16a>`Zh}U zOJgLVnpu@{LU?m9pIB(aYiYpcZtZq@p@L-Uou8)ILO&uVo>dQr@PyH$yv95az`5wN zfAjL-9Q2suYBwFCmK8^U-+K)24y?m@^H7eoGM)nhP{FP4-3#C9d)Fk1M*^UmOqN^J z$*nFNh1kp7-CL1GzlFVPB0I1shRZesUP_FD0{ar`PkRV)&f`VYes5oIt(o`rBI;|! za6TszLl@6qEc+(`<#*^9vx@hnqx7l==8n};3lfcBq##u~u_qOMe*A${{{9|SSyA!s zgd(G&nxVrf8!t_H*Qxa2$S}%diWavwujt}&?mEdLLqbAGD(Gvrn&oMot&!U7?Dal$ z+i#_XszYXPng~BW#D(~~^S7qx=jW9GVu$8zH}$bZFLn!gUNc}=ifsvD1f`QoTbY|9 zgv?kiOvx9JZDf4GFfhYIO5t-&D9i#s>jk-bF>Y>~AVQ)#g%rM=VMM7O(J+ZN$#R>N zOS&8axDiw26z}7WG@hwC|A$fju6?(2;)v@D5@=Iil{?qG`wpl%|B`(;zwc=z!mv=@ zv0|n~U-Bc5Tln~z-^{3fI^uifX5DoQy=702bk27TUoGwpW@mWisSLG9vwU}R5>iFd(X<@l^^u$afZ732Lrw(i)@i6b@oNo7ZtVtLELcCE4vGArpO-M=CJ1JWlKwu6@o%C zY5xgL*RG5A>W^!?+*40yWh*3kP6;Y;C9B4wbi`G{ZorI|pFVrRsA5MZmMgc4j=bDI zzR(=3VZY4@CZGQBbspuYYFC*Xq`Jda<^u9~xH(hky<4X-ET8>pBg z@+lUS02cqx+l?m;OkMT`M?gOYdJ@B-$|&R=HJRm z8x0tG{UK939ZFx((;I7xb&nNO{o(;TKVL)Apiaqq-VUq#ir3D*yg{DSeZ5U^R~=_| z`}u~l5_+_Vd&pnLtRPSn03jDA$?iUU+}ri$c7eS*9_M)Vm7siX zc{?Wua!C&R3%eOGbym3@#0VlDmnAhKayD?6iE}xr+L;egj?|JuS@s}_xtjLvPe=>v zFGWKFt?oozdEiWm&=^nimG?EJ*!Gv!s0C(JueC#+I^vK0-TMF=o7n(rT6NHim@b|m*{`n0F=fo(P#yZkDL3@nDJD^$>k+c^ z@O}-}4C|l00~IFJ8g3+7U!#9Bf><4u$ynynLN^nM{Dn~fBvZy-u}M1e=7vM)sE)(} z*&?6^&^vKHZbdqxcPdVd)Q#V=zUgPKAY6Zq@zsJrAhfiQbk;}G2ar5D-{{86W3fa4)6EJh9i=otQJ$= z=Ck@3O@dszt%JiK-01Lf)Igd-zj)pdl3BCR=qZI1eN$*Rwb(GAzVmB12(b9U^Ulog zwEL6MJzKD~wEXC;>rPJ*+lk%JDE9cZh9uDxWA$XmeX=jzpfXumd~Q!XDe2PQ9nWcW zkig}EW%f9dcjwyLdI4YAgv#V-aN`JDQ!q%wgS#fwGcq#RTFtC1e6#G>Or#E=auX#a zyivHQdrp7=RA5$al}Qf`33=a zP4+065SJ^&Et*)*h+8Lcs@O!?gY!WT8;LR{47gXp!dX!6X?LZ|M z#usFa7if{VB2|0#JUplD@ZRxkJ$?U2Tf}vLXNstKo7%8nBRX_x_sj|XJ zQgSdT=E)F*#|~*!e$%zVf;DR_);$e zv9RD{?&h=crmBbhNy}*7*YjyOz5y2QtbNDq*hLFZ{6K=eTL1 z@9oYU&{^+2B*LFlAdj_5DogJY5lfnx?^N<$eDD0A(ah!w$3F&-+1ytTT>u^mQwgQ7>2j;U{gB-tg5tq2luM^LMbA(-0-2woFa@ z^lk5fRT4y-m#DYjEQbmsTh3Xj0RQGNh3#4QjQlOs(^qLS$M+TGOlk>=I%qX8)FKtn zml%`mD^7V2_yzquuIxUM-FiU@Ogf?r$<-h6mZ{FwJQsEL;jt1Ml~lH&N;kH!*_TP@JWFVsNv7T1%b-bXRZNf=4H@cZt{g z$S+7OBomTSSY710y1!*gy`>;tL%3L6d@iop^_1w0Wna74Q+c`MCl_x|*5_4tdvuU7 zWL>qcL#pfx{~d>`a@V{Cb%d1W^vqlT3L(7jwxO$l(cwq+lm48W$heFX(CDP_RO zrTt7fwD0(}-lEbxPb6$ghyg4 z+_|X0 z_YAiG#=kqIOi~%T^J9)vJ-VGp!D2P^eA`kh&%Th0Z@xAvGJDu~Z30{i@3I^|5b*(7~Na+=Cxs(_OEvD%QJ{t^cq3=GN773ulT#$hBV~UFP3sfq+)I)DAvvl2~@VXgtRff#c*C<|0X4Q z_09$7wKS!8Nqs?(l--`LQ9XFs*8lAeS+{RuuIaAZ2KFRlE4mVzNJIV@$11i&&$aR( z(@wz%;um^~q@2WkvcT-b)v6vfR@!2t)mnoO`P~mZ(h}Nj)mp+k)g3att2Zg}cEA*} z70GlrzJb8(m^Jk%hSW{8*ar=O^we|Y^LO}g2x$Y4h7lMIZa_V9R7^PaZ)zHSS2UYV z_yP}fYl-5@4+|TQ>fgpr!PEkWstZ`wU)@Kg9NeDjX9HyNK8VE)2PkAFO zEkHgmPg=$66BLXt{%?HXt*;j7;FWDmU404$mWu@ra*BtBLz0JX#YjQ{y$u>O;EBO_ zR+s}}L9gc+CdK&N;k|SRU)4^${iv67;4nI3Sd0@o5CVhPEB=Sc`|=@U8W-9X30nPs z8RU6feWS(cgB+AK$cl3?{w{{!SKm6hI*1_t(~^(D+&CAH!4}vrtUp6M2kzkSO>AVhOd{!{)uvJ z${w&hr#0DY(#z9rvvqc7q{kTY){!q0W}M*#cy(wL|zqEOsNt&6eC^FxgpnP&bSzq?1>e&v@v2XviW8 z@ZLEZ$(z^v^1s#u^u^r-F$Sde#G!qWVcKYaynddmb$-!tG zky$1wv7YV9>a^71-t2n%cY935^;5xM1NQOu>~AR&6qqko!RLNYDjv+=#snbXA6$PR z2s!g%ZPW}I*r;|a7zRl+2b68zkd%}r$lHfzf4Ene$XeQ21|MCwvD)mc7yFkSZcrx_n$lOIbaY%an*XYMsNWRNunotAS=q(F*FOuOdhDYZP3iYZuPakVlzz~ zfiJ~)_5hR2gzW_4A5WBVP~hfBQ%^XDB^CL@+4r}Uw#$S)M=NyXbX0>&dnxN5YsZK> ze4YY&VkWwQprIGMnsQ$7*>&~A6AF)7Um$tYl8mXtG%*&S@pGr6_zDjf-+QT4Zw8r| zr)p*fj~!s{u5@Dy4wRaMXgp;maeZ_mzJK+Le%Qj#W{;l_+OMDL?d-hb^!qcYwg6LG zh&o+!n%?RUS?jKZ40y-Z_U#cDC}v+h!AgO{9OHh|F%X|8zDDP&8S6v7lA#+Z_b%pn z_AkJPz#_a1RYE#kI7x${H-$tb=8kx%w59nS+UjAK!aPmjUJ*0J2ap6lHj*N>ZwCZF z(mIVUT1atEna&cd;WGweH6K$Zb!rHCB_RNvAFHF~23BupPgjhXhBGt#Jn*l)uL8BV z-+T+h*i|`UD1BcpazF$s36PC0B@eHii~wVz;p*)A;7b*pI$rE?wTp>{MR=GVwowBC zt5tVnq#gMX7Z`h-?@Sz3BYTIs+LGtnRi>A$ILw#A#geg*7&NMM7U z9u9OJN6932+#yg3NVezP4w3<6ZYb1_u~}aP!+Zj6%%l*vNbi9yF1s=flmYy8&_{N^ zTul%7HgdW?Lt??rZ8ET2Zfm1yI7INFS;b_6*%pP${}|S<7Iku|D=E7XRF1i5O6_Xj zJI`ogHZU*f0}M})UND+#tcMJ|Y4_diyVrjy`wn)BH9QaTXBB9uW_}PKj)+xFwYvge zed4$o2NmjXb?vB~vylq;b>PG8+yc4NS(hN#DlUh!nkEY7j~?Gy>@PrS12#KN_g!=t zAO-Ww)Sm4!p$emcu-#|0zUx|-Xt?&|e8}fXIxqmCaQ#$l1ALaaVUXH2G}O0-(NFg! zyLL2Vev%Ktmt7{@FHduXXvpcJ51F^D!8>%=IjAx}PIo2rLs!iAD}#+|EVX#UJb;z4 zCA+=)l^Q=0tJkV8ON|^E0Uiyp3&bYU_~xzJjI5QJ7aQa;8paC}2RM z-6ki6BoRKpr@}3Vng{UJ0EUa;uMN~YlwYj>jR+h9S@H6;4q>B`SbhHZ-p26~P@&@w z?>P@M_YXQDvUaQ$6;E=9_j$)|KzW;6VpQ$AjWK^l)igv|(A)s^g{iB(ptpoBrd~FkZSp$z;kC83h?l2l-5lar zH^zo>b2)uti{TjwKbK~h6%o+T@W<>XB7W7E`T7xRbrO3rpH6N}qBXOGn02+&+Pt05 z|L#lA$A8EF699i@gABH(DxoQbbe)WMSZ;?DokMWpDreJ_Z3Z7ZB)%`LiZ0@>~n00nPsGpn42&nZnzY zNgt)ZZc@L***9ET7<}o(+rXdd>NQKv@_)MyE=NHjwIi)EZ;$SJ{{8xu8IIabVL$v} zrU-4BDs_MCT@@;cG�p!#vi^Bo4`cm`a>JRXHwt?TjNXzd z)v2B9kb`i$$H2WXXwHWK->EJA4%_~!bRlfKwyi$#KY(Ek>}Gr7(nI~T2SMjJLVpA_iShG4 za4sde{+-!ku??X?>HjNoIOG384(HS)&34W(BL07o!{54{|X+bNlw5;v3-%-pM9=g zihl%yZB8odRB9q&riqpJyrOnht@&Kr z1=fQVLbfWSQIvM_6e}k$_i_rMQQwhxa#etF7n+N&WQL-Sa?wQN2(Cx3vv9)6VT{HPcDu=83w@ zSMB-GVJ_>o+0tLpowQ*TVkV~T(pkqtdj5J32$`U>=3$B^cr|By!tMcL_F!oy@Xs2r zPId&!lj(@9K7*!{^BkUt`o!xc4U-ja+VdOWn1NnH`e2 z>8)}hEP(b-tRd9F&`>Pq#$feVjgXm;NakP`9-;51IIEk!q0ytcecO4`18A-oJl}^IUu|M9qu+o}P z2|BaMN1}9`Ei^^cem!=>)Qn?cKNQoz8uqj(DNNa?T0=4b9aeFHs?7?j_>55*TN9Eft`zmdDn0N z;(os`V(ycOE$5K@>8xcXY|#+qh;C8&Hm>d+tzjR_^dbiP)Snp%EjbPK@xp96?bqZz z^`IuQa^#nCGsT)?v&!$)DDbG+uzeXCiZ0Zti}ccNeV@fyah=TGkF#w_WypB1MRTD; zy99du+&THRg*@S`wZH09h34^`I>o6Td6;2DMb#5f{dcwxYkW=+Tc#fcU2~Olpz7Q) zm?asp;RrNKY9D9`;i5G{B9d3OIhvhnd!{tw%W| zof*Fh221wt*bda%fd&R|vORUU?XiY(a*!iG65`%P%1j zk$$sT{}{rVazOr;m0+g1o(xRYqxy{9rQ;8DxTG3I zZyF9lL{Jxy;04aCiSll~DKcbPd=$7;n;hG{!^n^XZ0__%cW(*_%utk6p~%kMyD7#~ zbv%Z@PaKQqqh24A++IAiQaC-a%&Y%!5Wf7{QdzpYoO2LdnSem}%HcI2=DA~N|M>e( zvPon~=Ft~}pS~s#Fr5CqfA_G@T$1`zD0&NDcuE%%cp72iZ-y|_=1#zAA=4A_W)7vU z&BdqnUW#fwx>Y~5pnmr_mqpTwKh}*)2VJeKb5~Iy;#f0Iy5{`;vzht_%BKpe3@=fU=|p#iFCeAx|*m?QpVv%kq zL1E`)gaN0iTT*0(`k#SNf#QW3#>F>%x@#|shahO)19B})=>H1yy_9Rksa?WR>| z)uex~(aWNO=bKqQc_URcP|Ig<+kcIpI6)O({@T5i1{LTCLMp)%9Jl|Gz=KbPGHH|Z qstY+7q4M{i!8IX+8-L$Z*g!(P$E!+1-}C?cjloUR8yH=u=l=(8FXJ=- literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s2_fin_sections.png b/examples/pcg_facade_tower/verify/renders/s2_fin_sections.png new file mode 100644 index 0000000000000000000000000000000000000000..ea415cfcd06ae9f93c916d7d9421a1087219958c GIT binary patch literal 137089 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
F4iLoctkd&(>LjMI@&t-BRs{K7LA~ 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ⅅ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�UYkd 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%0AP3wiIRr4t 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%0Dq5qw$XQW>*uvS zr(_jhk!#}4b13uL+02KA{E=LgaouuuKO)+ar9`sg$pARDPgjylU{tHmyoPDtsziX5 z8S-C|Z`AK*lB=mwg}mbxk}eDTvQ%5_yD9Mwd?QW7uv00&M(kjnWk zlan%P0oyr?GRFA z=%*i9L5*G9sZZ_-0jD(RO97l~$Z+LN+E&$4kYn5LUyX81*f8RR!wz)-_8rcnCVSH{ z1G7@snk>*|2pDXU2dIaVPa5nUJwCF%LQ4bsF<@_=kt;g$ z_U-!?z)|cr7xW%5(LqSGbVtj+9&iiSr%?8x_hXP2Ne~5?zC@0=1*K1fAzygRC*l5d zBJ+<(_7dm%GVb#50cS0sEgROF-sW!$&F|=#vh_ceIXq0LmdRzhk-`|$*2qN~)->nx z)I8@Av@0t~IhN~A)}zS8i)s*Il%Bq7RgZefIIH*uM8HxXESwExTfL~kiH+|I%p$p9y-Ez)ErNxQI5P-(VlPtd z$F5TKqFjx2$9QyxNsC{3F$G6wuOLv0F|Qsolacs@#@3KH-Tvggz5aB-t8Dl1&!PIR zNi_=-({TM8)tZ)&?L+X`rrIwTP2_XnJLoJ zvU|#Fd*!awqu7$G0#gX<{S8VeK#mn^V3Kk+xkuQ@6<{=Ox=G!zWDW z0s6^2ptfJ-dt^wiLU>BNS(0Kdd9uamIMg-4@o5-{qBQFm--F29(!taTrzu{Z|0XiU zY?`wANY?5_y=5v!hZ&*RwtSe3)8c~~cw$!Zw8NZ)SZETKV%B)ib*Oc*{(9qRIq@h* z+R4i1J*&BAKN>d4_f48GjLZ-hC~L>D?eBNWg!=36w3+MDh$wGgTTrN2 z5WlG0Ryb`kUn8q#ZH*-U|Ly*@dOJ-!)Lgxu$mKiJ(f{i+ k|F3h&|Fst{&tXHpJdI{`L$iGU)ACURrmgb!zBTfH0ELjHYybcN literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s2_solid_types.png b/examples/pcg_facade_tower/verify/renders/s2_solid_types.png new file mode 100644 index 0000000000000000000000000000000000000000..22afd4b32e7d09518363b26f6ef8e0b11f3c1907 GIT binary patch literal 54033 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 literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s2_vision-w1500-h2700-s0.png b/examples/pcg_facade_tower/verify/renders/s2_vision-w1500-h2700-s0.png new file mode 100644 index 0000000000000000000000000000000000000000..19753a21b79482cd474156083a09c45d622183dd GIT binary patch literal 56627 zcmd43^+QzO_dPsFsI-96JxGH}N=V0ufOHNZC0$a|A|XgQDkv=}-8IA*q=0mnfOJdu za|V39>+}5sp7}w&F!$UOd#}Cr-s>9nSVe&VmkJjGfe^qHWz``NY)=RTGw9kC@RN5- zKZPNX@gtb5l%{9m>cmw~vbn)8Th<0|m5EqhbbH^l8>V(wTfNyBNKo>6ZS>S`$msFc z$=Wodn86|NBY zzq{$}BKL8jaQOE8B2`z^^c7R|yhd!+9NdE+4FjzAa47W{m)X2xn^>d0syg zA2Z{URg)xt6NlL;)$yr`DjAmYkepPV>BK64)A37V8^pQd>+Od6oyZp@VdH9{th^LLkaoB)dZHefY8~G< z-MW+E&c3ME?Juk1$2;rRF&~#G2A&SFCjk2_*IG(;Em#XK>fA9+sv>ICxBD$^#tF&< zYnDLL+UQ#ISMz_zrK{o;Wo9mF`BHc)@9@Z;p&xyFY9wPfqKc#IIvj0l>}q=CBAVRKUhB6xh1Kkz|y6t z7tWD|x%$F1v?8C+X@`{8`|`$mweo!ZP#;Ga)}2gW>Jju>`F(spz*v;p(p|5?=kl5O z`o+xAk0nzhOYiv%g*n72^=Yb+F}?Zxefopb=yle}`*oum#s+l{Zbi2v%D;s@L()ZEi(8=SbXw@ynQq-qhFLU4e^FIYr3zWF zF4yf>GsEff`|BfXvmd9p3~G=Dehq!o-LCNBBW(vE+a_84hvD#84R!JL^8DrAZvjQQ zO?&7WLe3~D2_)O~>wE_K7mU33XFsO#4BH9jX~eE518lR>)HHR1u{t9O7)g?oF&&r*fikNbyh~AOtxsU#RJB1@$Ixpp zr=`a5ry}&Wk_#JItoc&lR(6MR^}&G00}d{Z@CSsf+2gi{&u9g0e$jJ= zJ0cf)_*5v$#x^nDScw%5}Fd3DH^t}yYpis3x8P(e7hs-57 z<)m0t0k?XD6^V7+61WJL2bLCC;gGpU&pAuO+)q-xq9J zl&eqwes{Af`t9M3@TS?Wh8>(CGb;%+Hmi_f!@JGyPRx=>Al(O)i?DyzS9<;kR)`pN zvy!VYCXSeoa~3FV?|z|Uc;_trqcN{OGEHeg#X2Wvx1P%*$YI>aS%h{(8u)Dtv3ktw)-i02dbnFXBe*X*oVP?9+>VWew^~5zZNXAFfYhR`StT?sC+Q}`zgQbz-hsdglId^=5Z;PT1=8uErnvz6+ zBNJ7W``p>wH1g>O#2n(3Nha98gKc3624J^UHb12SfgmE%TEm%0t-heleSzG4T%emaPQrtuq{`i1_nvDP| zLmGr}Q4TttmAqpN19Km-R$~Y_mI9gB2rO)I20H$4qE-GA@4K)I8+<#TXVcdlZ(_K8 z`kYFAlSxZJ#P#vHsF$1nRwt2P{JBEaNgaQ5i=AK2M)y5j+wNx~NwjP3wVm@j=I<`U z^VtX7H{fu1Z^uB2#nDgs%JGhY>bxjqj=xsqv@}gm!kbm>#(~$DFSfVovhntiCW>$7 z6rsyb!nYIMrK@uj3^{BsxF29Zu*i#`j%ty`OZ|of`W=ck&G@i2g^eB_zi(##YRP??y&J z?Y{E4+rAuY;vJjTFAYZilK+i`Z$D0*)VRuZ1r~zP4WH_9e?J%y7mF~Bv+&4mS!+AV zLr2!(EKf1774g0h0uJg51=#`FF#V@ivIAIpgQ&xwB_?XweX3&34pq*cmlJqdfh>FQ zkRd#fZP})vRKa-4TO)Aam)LVTxWYSn^!S6!UJRK5Kh;~=PopajK`5)}2F*K(5v-mbG(*)nYH7b5~17aV{wW9y{2G-hW8K?a2K(qLa zK~;m#%twXVq@PY`#Jxj70!%(Mp_5mF?O$j+wuSq~QdjCvHN2E`YO`;z^-HEmyiNBzpBHGarRAZ&l|i$!{xd{KD{cOu2VB;308jKRq*^pC3`q zUnZSlIp{Ntk(+ftNhRI?8oUz+91Eu^24t8CMnWb>jx}*o;XGndZb04D zkhaM68G{QvUr^zV8#hxnTZwht&Ca7Xp~L&<(+BDwy3Zys*ll==T#xRYXUBIA< z%`iz@E-@t;5#>_K{?tv{%;yU#&nK-7Es0H<_3Rz0}mmrn+e>)hHu9f@$3v7 z&1K2;xWW12jYUfP`b1ng7Vo>J^hYE{QWA*jo?<`(++Q-1_&@^+m;fbEvkX?0B2c1J z@HuK)aTIo+!z)5btVQY(CdACR=frb_nf^u5g+%8QwNPzu-<5|Cp|J6u(U`#sL>53% zW=?T#QNBE-l>LeWL;^uA{&vOmIhVv4HwkQd&os8|DtAi|#&!^)R`8i;{QMZ}TYqo+j`BSU7BccaSJLaZ z7fe8d#ZqjN1jWp!ajd0lC5^%zt5QPfaYX}qyz22#{@xwqoHwLijeML^LW zJ@f_Agxx?Cvmz1~`)aRF4<9lesCP&5(#vIq7BiVwTzb$dVv#kD^3 z!DGN)^{mp#I(Mw$ZhR`5FAS%iRjJmvK1MwN1lj8pAO~N?ldJqYOD+H)%SuJ&+%^R4 zQu;dxsr?@gTybHn_QXSmWn6S=5D}?p+{mW0CDE3b~ zCHjsI2l6CI93OcX{Rb>I(V&TY`h4795}@dGu@Q3S{E)B~8^0XvOd0q6`e&!e{?_r8 zb#L3l+;8Lg{LjvcT1@Xsk+skXc=gsib>(d}Zb054Bc$%+O^Au;{(NZBQs)3aiW=6v zpl6WEpa`7QPO=x{>lqR4q-3_0K$Ixnf27=%3v#hsa{+V=hd=}sr1bZysREj~ajRp?NCa z*lWCSH6o%e8FSkk9Uj1;-6FPvjH>5L*{KIBs=deoL+*&w9mZw~>@LnfP3U9E5K&q51s>5Y^hgWG&h} z?qM3m)47TAX^YpH@?4u<+OVwptPuh~?Gku^jo2##>ek-~qVemw~ z+wFqD(Ym+*E2{vWsJ*RZ3U;ELdPe&U6M~6OdRl%Z?Lf^agEN$nsaG3c%6l%HddMkQ zPu6H8>y^98g(kWx4`IV~w76-a2x|8f-;v9xe& z-%B zvEOfJRKs(#!qZFyP>KJf9V-Sp>ZV+2R{E}zLoBc#JDx73rL{Yh$w@F9xstYKk=KRQUomnf*-SD;D-L-+)(y&=~%6m@mFg3K`>*-#@c*%U+;NEiJFZcV;dewyl zQ5~zrTiNIoFg3Hh%lmBYS<#CikdG?*h3DJexGxu`T${i6@mXBM-uw!Ysy7-ba^l&- zr(2CXc{y$CRtDo5wJNT6@)qP0fKV89pBDEhvUP)RTt7+*B)0*UP5cQm80B!V{gt_T zm^+A!mE6x)n`GpVs=80q@5CF2{BMjqI<=Gtr=22%4`F>>ay8G+cI#Lf%-neOt{mXW zMdnaMZ2apNhF^{Q223X;fq5 zrk`uj=L&ll_%$ZWmNn}B&N!b+uUmcbXJMK!icVgS;#Gw1)JgBGyTw!U-@6pU6;rK| zIRyDxSP&EMP>mnNC)6~OscvXkao%n}JEN?M-S7P1KV(+am4t#0*vH*$>o6hCv+;R( zb*I7i$L~)sk8ZxF>g2U3ll@Jo^{V`H{Jaam6LDG*x1~{ka~t`>T`EoBlP1*P1uO^? zZnlsP=K!y(ky?4=KZ|JrSk(IKw2Gnmss^Lm9HQ{x(}tY{Y*^xw-hlM zg!@L@<|VZKV{(6D#LhaV$6D{x>il7JIpIreh;mjVcj$M#RVdhzJ*8Mz82L_sXZN*@ z@nap=%2UtXH4T4*YW@LxA-{Y;_`gptc1xXZR6Dq&7)`_$>aT4dgYw2YLm5>@-_q)b z|EX3;iqGJQk}6PJ={>|lJqV~&=9kwO;L08uSVA+b5z*GE=~G-t&Vvu-pI z3LTXz@cvzM1tXpw6dw|X{>0IPD67?frI)exc(TS1ZezagwqIZ2qxA&v6o*0AS52mY zY!TwiF|dW?o&tuV;?Ha}VXcV%Aous$x{TZ`EJB=l-l!-3wtm+klA_X7{?uQ?Ao27s za3DBpWKfun?R)W~qsatymmixO$zJ~k7E8DA&wEG5d&_=@jn2%Wg!($_>PC9j5gp18 ztVVcS>usX@JwX;|<6`_g<{DY@6SL&@;FyW;|UsDmj| z-k+~znRx)UnE&LR5by{IgCTK9yk<+RVC%sof*aoL)K{rLvQBsv3G z0w{hC*&i<2@!4i7p@DwPe~$61V$FzcLFpCmhxlza6`F2YV2@ZOeF`FN`NTOF5b}S* zT<0}b;FvPgtvoVUjhw$81QsU6p=mSls)Rq5$U@3aUfPi*YY?GN3#5NX4J827>-^R1 znKp}mMHztJ7wxdLtrV(Qv8aQc*F#fIt3Sw%{QXC%jYn^OU30fa-u`dOoSs+T;Ksr- z&k;@=MfmDp|7FV_3uYUIh7}^* z0|nMd=)ur{nsQLS|?1==!@JX9&$IxHh!RHC^{2zMWpi zHxoDvUD&jXePyQ~tO$reZmmo<5Bxa#QDooj1Pe;Hz)17nPNtS=hEqlC=B^O6*^3i4P#;b*eJ+w2x2Dfc=Qpr6WOz9=XezXJ#Z7{mI+g3izf~y1sXiJm;?r zOoL3jQw2ydOWNJS+$Z-t3sq40R)bxW*Hy6^=F*-Rlny4F-KS~kr@$%IPsmDMks5}0HedSXE z4|&K50l=6vYw97s|H2r18}mtkG4%jr9JJ%_pAMOod|<#eixx5Ot;zQI4=(Ld#~6H5 zTTxZH^Wj)Nx?WHaa`Jo=2C0mQz=51+NoN!ea(M6T)(f$CPF;1=NHMM*TR%?p`Rx$i zdGlI`d6~31YEm5O(RL21VR}<%pIcqB#|>w#Md@xo)*6^|0(co(|J24yyXj~^izN>R zqDVPOx(>-zdjE4p$nY!lL&DK1evjtbsPp?S75xg>wvry=<=2>8bmVjWW^E<_=jGxc zRA2&8o|Y**O?&F(9=eLY@a1IkJ34Y$5jo-B85tF)FRMH+iL8h!B`8(pVKbd5#4A~ z-mTurOP_p}d;uQ0HlnO$csd;M)CP(J2*n)zJh_isUm zzqNHMH!Lbhx#D*F^K*EQTD-^lJL}i6g^Mw73zy_wCABIZ3!{sdajG;r-4)w^27><& zBL<8!%ksA!*J<(W?rk)i=O+gXG_@(yum+Fo0pb6ZD$4Veprz1fdY34xek=2PRyLXn zKm2bhvS?G}2#1A1!;~M%gE1|=#O~{jz>n~|ey&*85u&L`xn^AC+BuQrF>qwbc79aE z|KY(^mpm9w3{}I&k%=#)_1{^9EhP06C@std+cNij-r8Km$$83#` zRT=_jzXB+*y8S?DizIe<4{+!bjZn!Tu^g6Q-eLUniv9#>0u&F?YyE_a7?n8dj-OU0EWML@;+lQn5$K;CO8M zj{pG<&siw^c-WM!S|`j*5-FVI4kstmBMkm_SHKS>IXo2prMcE1n@Q+>2XLY$f{B$` zTvWV16$MfZJN@0Oplqt00H5f#6vCI(aJosDI+tMlP`d70Q(v zM*87gqcbb-!Ly}4-uk(sf`7HgmRUmBe$0#DY4zFI+O7mX(Te0O{g5&XQ*tik8to2Z zp+Lv8yG!mtPiPe>#@8{6%NiV@a2+{rHrmqKjii;qEcto3$JAK6&dqtt%#Ro^Q1Qm- zK;~e%-TqjZ%P|KuNHV4SfYrnGEVR^MdJGh;olf|R$z`_ZCzFSIde%IF_>h1-)*4a_ zg!e{3hO|6pK$0P&`d@ZZE9f~D`hW2Q2I?e6y>k(~mR%or*P_F@JbrWvBwM=2-I>Lc z7yGtSBtWh8%9{P>$!dNgepUM?tN212FRsE|!$6Q@k(a>NdG8ZSQUkkHbP6l;N_%lp zEtCb-LXLfEs$mnk}sNeph&f76d7|7Q&fT z6RTEeDWvUN6_o4SwR$wL8%ZF50kOKOEA<5fW0e020mL17 zC~DX`lIfdzEeA?~N-%WKFOBW(Pw~?)_4}Xku;lkT>3j3chN37VXYk~g0~G@>Al*if zKLyNULLmS^W|V%99hCk}*xk2&);r2Q9UISc^dGhHW2dwxkmjNra+`3d`uO6yp3n?l z^Axc$KnT7d3Sn)@Z>iu=2X9lwso3bMl;!oYl3!5gwl7tfR}ID1+0y+pO*D;)neZ&d z75|V!AZyA@Q|eaAWD!{UAWT6<8(H4k383&lbn-gtW)JwB_vELj!wHqs3z;FQ6HKpP zm|cTH!4%aM!wqQDtjNM5j_kbgiyl}^9gt6P?+hK;3z8IpQHdFGqF7_TR0m#-H&*XB zGKhpO=|3(cXh$}b+yWilwd+GSxP9$vkPv+uz>)3C4l{qgzXeH6Vr(qti{_igNyRR4 zy`p&Qx`#8ui5efI&QCry{%pB>Ri7AL)3_4`s$PZy<s5YP%28nz;%#~10BSDaIcg}bT!EX-++lgS;mLs(7X3VKH|yRt!%pC zdtmBHraKrAhPJ!IRnL4N0o;!(cj6%WF0D_*u0R-I<#|%R3Le_zqj)9aYh1-}Fb?=A z$26+plr$MZ^;mzyfH)%_^gUzhU8z^@ebup*-aJYbx+-h~$_8g`Yz7&9%lC+A{LM>LK0DH!OaoVuS@r zUR=e3t8R?zAz)#k?tu=MZl5IIO-~uyIpe=b0^5MT1?R5#yvY^x>d{w_9|u3QI{ z8-0}puD)Ce`}<9IaJ6~mI$ESLdNG{)o`sZmvlPySkAeAen_TJmgoD7kJc|MF^Z?AZ zmzP5!U)^&Wevxr$NLF%ST?dk-Xp6<@e+d$yB&HwT%fi@_+aQdCPdRQ@wLKQ=6)Vfj z%}R=HvrqW81c@iT7~6!^On(f=Sv|lKsA|yPhoEy-@Yk20jY->ruQf3FiGV4NNzQ^r zk78$)+S9OJv%>j1)=QY3^e=vl^II2Vfo0lV+LS29ejDjER=fk9%WLk)Fxzj_?=X~s zIOJaskxY<64~ih&Zzd&UCA4C?c&=polhXKZVP8oNz!@(-onY6&Kf0x>>65X9!@dw+ zE)3WTkcxm`q_Q}%idj2xyrBKhB}mrF8qz@^&H7GTSmpR&2?pOz=)t!o121pq=XIck zvZ!zt*I!N%)VMBhw~`;K5$I z8;2z)NtYmMgb8^-ELsa?Mo|O4yJ8r)TAmm48;G)oIW9LubcmzR&y+y27XTdil#f|I zTe(dRb+C~MbPz0ld$~=c*@E{B9GDX@Qb+#&;FF+0y`u&-<^?dK@2h(5LOuRVuo?!d z{QBkR-^J>TuHx5pI#2}s-8?Ia(F5~_NJqMWwMzrLGzdx2W^r%`qeB7l#0l}l)E}J^ za91@itzeJgg=N$A@*GGdNCVL`1W11Qn~XT8`&X`4eTAI;*H~jRSo9#_eM9`+UE0n( z&;k4jEiMDB_TuyRxMLbgj$*x~9mOvA?tlFzAHl%PaNQll%Hw~I?q9|$*%vcF^Z@6g z831lYsP{HXAuJUF_5d7S4E1-0V8hGMp5vIobRm7xzL@vlpI&_NuZ{iNwEtx%|9Tj( zhrfFcf&88Pzqa82F%$#)k~Bgwo)%*i@A7>6?qJ~1WBzOJV3*PFU(Zq0h80&c|G$>2 zXnH;AMoc#~QMvK|%p1DTy&p8(iZ!tsG^}Xy^nV*U#nuvGY+Oc^Ehe5ppcUU>AVa=mj)gn_>w{d;3IarA9W)P1MMrR z^`>{QA*lj)NvhZr2~+Q1&Rrk-?U-O7DUcOjp0@3i@Uj1lQB1dyG(HS}y-1(D1cy*G zM)Pta1yQ<~S7{XK(4B`Dc|f;1Dq4sm+%Jg$%~|j%ztKn~+$wqR?-eb$s+0T%48B~+ z@H?;#_q!_3OkOmCu#Y}D+gAckiZ8JKUcCfYcV5V5qGgu9qyYffF%L4hxSnCp2uN}= zT$)n*2aacp0a$<0au(dt9U%Ly7sM?{>Y5p4QxqL1DDr^93k1TTb|-kA7~^^XXq}!; zlVC#vu;gvNS4QIp45FKzqZFiI4&=m!Y8WukT}9t; z$u16up{JtC36l{gRr%6?p`m-kXoI~-Jn~HQf!dGT<@p<*X&jz}0Cca%>L~@7v=upm zef-NDUX01*sBO7V!joU!xH^L;nRe;F(0Z(JVUUQB&|Ny?>7$opc8!cZM0WSqus0pS zk?9jL-vBfUri!e$DoB-ap=mRppiN!69B|F&VNKh5x#2itTab{!G`{hB)I;Jo~T8-0-SA{NJOrGVMMO}>o~I`_Unt0KVX#QTxx*i99o zVs2m??tFrG8LmLS=;HC@2E-~1T^!K!*&{B*Bkl1jj7mJfF!7$yTmh-k%sqyGC_EU& z%Kg#9e;hL)_RC|itJQRhREZBwS{`4T0OLD5Mb{vTfGl7VR*@yv3(?b5+&CY=VmXg38OewMf z%hKk(AseMk{XLVq+YYeX(XYhK)u7gs@O^VU%Sj|)UiOlWawytc;Q`a=jJ_Bt_2%84 zxnG!V!0=KnoI1fW+*gq=atTC9hioMAF1M!~JBZqS-WlhzCmZ#Z4Cr;Ft3PE%a|hhI zq+wRJ*M!O&x3Dfagg(TK66{8$60VKV$+6kB3$S0s_d2D>wx)4{K#I+VZp;^fArFpT zcTslhTRC1|#TS$#AwafdQl`^k0&X>Y*HF?a|I!qt(yYdPy4~t~$#vBX)!>|dHQmg@ z0&o&d`|R;JhBS~xs56d#*}@=!0L*B5Wy*gmGH>+T0JV1E{)l~{%KiJ~;u0n^X5w-Q zJhihW!uMluJ#+bd(VNoTNZAdbo~hPYxbvab^uu7bZa$qk$^q28*+snll3pi5zSo zr~$4){@yL&z;jAr>PH`zTDi5TH6_qvE9$S=H%v_Kkt^N-=4P3#l=gWA35B`609k^s zL(0A9!(aTGGA-ubzb}P0X_h>TO&ns}PbNAx601*;;A&T?kW;6o@CWXh?Q!t-4--Sp zKA|E9dZgPAU4(&XU=6JwrwD6absuZo$~F`}E3eMI^*%Po#*my0P8_=L(#5-6avu5e z>1jL*uwmINvm}gC2f%#T&u!KSj0~8 zT(k(4uUh1wq*JgrbjZS2!N@u>uhLe(So4BhY;uDBy?H2=j-EU~sL|(4l1vVK0Vu#D z>Vds7uE5t4R~0nxzr@01p>s^6=(@t?q{cX_I_Z_tv{=1TA8&m9B9<6 z>P>%kH2!{K59QptD$)Bs@pBd)6}rbR*{U<%{H?h$M0}K#z=N_?AZ(t?3FEq zNkm=G#Y6EISBmg}fb(?|mYUevVvnzv`?1yhP`h^FdTh!D|1G^mxJZWP!8=%2*g}Du z>VrB%*OmbhxmZdoU{UQOClAdQ%(Y#DF`@SXmZEMU*8wuttR|199Q6WT^3C%a zCMLXp|0ed9)~?D&7cTDow5POJ&vaeRN1CkHtLffEBwTwJ2EYx{JrBrGIRku14mc3= zob9aw-8&x3+eIos^{fb;DIVijCY58Pi5e6_iB*(lSxy`ws&j1uxnR;&D#EEUkDRybhoaCk+{pR3Pfq5) zi=}joJl!u}COBHLkz@9j>e%?@{;`v{%fCF-s&DR{Cs%{79zh1@1sP{S11X6b+3c3? z+$c+r$pqdf6WH@PDesMWm)a{|W4K@yFHEK;#c#Wz`z1svzPm|7#s)D%_iqh}J0!Hc z-#fk6qDM5!^8jgHH0{@!cMZt~YXk(&iaX-lua_8hcrS2Fvan@&B?Hm zn?`;oq8LCq76El~m^zR{f~kk@EsdPc0!_4mmTpYkf~&Bm^5XjqeO>)KTU-6xMBE>J zhH=oU!0ypk0s+xj#aifj3#yS}HgNd2{YhE)`TV42$p6?ZtnW#jMcYZ3l>n;lByfv4 z1m93cUEfGAr_}|Td|q!q2T+|vwUcr#k!QW&^nD02u2_Ufs?qu-a_ms0dTo- z$Tn+LxJ=9-ZlWX($2q$ijvV-@D&mbfN(WBvSqh@WSPFCHGA(kmmgUdh2>09hJ)eK+ zYiXZ;$kGFJJ!EHNsP-7o(Py*oL;^XtkojD!r+V_f(pL37-gv>yRC=Y(`8XRfDEqx0fROrc zRH&EtLi2b{@<1fhM@jzKY8>8R?x3)drq^XM3A0kaEACk&lU>{AuC?wB6% zI|q%Q+^lASp1I=PR;7g6(y=ok!n1jgXawni>sPA)5X$ulgsR4fehO?7p<^Uy1LYC~ zr(n#0fC&XEx`4d1pgErI4h3sUWAeeLwO+w9e;Fsno^*U*E~B`!W3psgS_K7MJonA;!n^SJ*+Y>WJ!Je5kpOJ?6x zFdxaG;*H&W^B7d*XlI>4^F58FZN6yX`j7j~>MuEq8ve{DINrjVo{g4RA1X?@3y&jl z`G3#YP~Ti~mpATu)HniJO~tu;Ro)ED4Bu=jBS=(!8mCxZNczr2ePJ&@yCEw1!asWR&sqnR$_ z^ThWF6${DUbgtb}2q=qdCJwsnMn)zb=#gSSiD4LycwSQ-`q{sLyns7?YZ_m<&ssTKbjQX+4oLN=Cm8RHD;h`^5Td zBddCsM27jFCqSEBq4LI}S;ge(>G1#}+lfD5Ufx}1tZ_)dovFu8@D1~|tJLqQWa0fG zwk}uicfJ<{C!j_~D)IxA5)|>lk!Jop?#v&3pQlal)!lG)wIX4{AzI!nZRDiXv52mo z_0}WrxwWZVJh1%?_tu|LjXOW}N^|GV_GjNcZx@fF(-5&SDbUV-l?Eh%sTQ#2%$MFo z9){rx{t=@|?g@5ySXXG=AqF1@dpUF6ZWv3h6eLjaToaFI$AR|;PX-D;65ZX=So!7# z+sw(JfX3YE(YP3gREI!j#5blTuoPuEH=)v@O&f6i^ zq&pJdy>52g`RWD#{PRF7}dPGaN#y0kMp@@`dRN2R^L} zG9pAZ3k~LMGz2EuCcU+M&gDJ1vfD#6Qj7Y=Ia2)oeOkn#A0?Ddl-z(>%m|?V9siH= zHXix!itD{I(eD~U0`pCV$mU0=N?-P`REiNnF^7^^$i?@Uq97(oSqIA5CBfh@=a zi?Q!ygLXFh2xt3g*g37_&~=8dx_vj{Lod&M{0rIB_W?>Dty~FA{YSct^iWNg{+*(v zv%|Hx>>}a@Z{LVfU#o&2hWm~q-Qs8+G+#vw^q!Ddoqbc8VNc^(ku&Xy7?q9B)6(@E zmO7?25k%o*$&~6bmKtx+P1OGOzk3||k2GUk*RWktYv*15)d$We<=^<07JKVM4&73= z#3g}c)ZmJSeU~lBzAgH@{Jr&d#o^3@G(n{@(02Mlm}c@DCF_G>|KVU?07pGtfGjK; zFiBILSDGNQ$hFU-c9w1XjGlXpgb(DfJ17rXzzA_O+s zVN^{u4UH?xa}JsVzImiRGYltS28BR{It)Ae%+R z&c7~IpE1yzOh6)Cd1*Yf|jF`_eECm!#iB$L9^J?zEYdGUKKnY#6cR^Pqfmng6^jr&8U`eneVzl%pFk9 zfHf)FziQza2;y#qlt!Ksp4q2SN8f>Ir`7J$ zeF{6EkCyuc#H!Ix0ie$K`YZ@PC9vC>u`B)pGF(|9j7}9&o~XcNyV^$w>Mh)4}dbV#^gT| zsCz$Vh*mz9X4H)xC>;47Duw*k&OwLg-VyVMsBPB0f(8tTKCu#Oz;6(MR|;NXojx=D zq-FbBMRdJ&`sHy`#3;Tz7t@8d8s*rvUes{h8Sx?Yc^m{{Qfqgv>2FJpg@p&9K=V<#?RG1E^#;qHaO`I(UegszML>Il zR!CZ>v4t@E3!w7zw+hkvNG;_U7TDro8=r?o6{Z7~xd5tPR%$^1LGKq9@E;S{Pu$wR zLGca4P8Ot7yf>NL;6z89uj4w7&uT|J#E(|LHMN)B>+RsY0yKVXG-%qw$wOh>E#P># zENyIG@Vrd=Z#KpHU{XfYb%Zv$sm%uD50LJAO02SK@1QWUNWDx382gOdij8oE@AFVQ>5Q@E17ee_e864>zso zPBQ=Ogj=VB$3dMyhed)s z0vb2QjoWt3Vi#$t_V(Qk7ua%OkY@|zD@jDPlnmCz*=HEX?=L_1jNN}xzxoVTA^ z^r_>{xc_{-jQj3&HMK~k&XiHKd8eM5^DiR(T708b>O9qzD~bv$wPP)8bNx4;DD18F zZFG=Ea~W1hBh2AC6YM!lA3vr++jgx9)7acMM!Zu_i9~$IpTDR6VeEZ4a&^5%IkJUX zRjS}=&X#9xi`i);6qcJC_26Xj^=)HXT%1}mSA&xUdZO`X30b)YoS0j2M+zsiWcx+& z*t@~pJc{lRN94VMO^PMYd3|#2*7Y9z8 zgd`5E&*&%qZ1;*Kf5=_P7(00}{yO;?J%3TZmEV&3>=W3VFz{wLsKGrJd)tSW+Isi8trw#JzTq)3LRk*FV>g8Ai64m3VSxtsq5N1Ox_v z*zMUc?I)AsEM)JTyRq|{a-XpuE2n5nT~C9v8CCMl=$3-(1-ZG;58>-|8$DJ~rfbs5 zZo3xb$#4z0MW%|Ky{(+uyU0i3k%Z1lwmdryy2L~iHqHhspL+`q zkLxECu9SSZ72Tw%B_MQWtVJiMr1NULc+kr4{^@{67V0ROE1V}zW8nY!UnoqzlCUz( zRa)w~Z@>P-;dqMwAOV|>g*A66um^G>P&%$OdnUojIeqX}Wyn>TL{5MXW%;L(_vu;D z(~XAc2fL15F?ngHiYT%tz^n?oYb>&TCCSh6tW_F2oHTC)Cr&FrVq+~=dn|JEozOx;l$HcL*`S=z&qIje~3rWla3CHhTS`~np(-d#g`EF7CEzb0?OVPhmu zRhaCdvQomrtk>lg);2ARN8TJ)`vg2YYKmMjUYCy0*HBqx8Nxk+TdwLK?rG68OToI;-vo3 z?sxKJPpM0Vn_JIut*6q%IQFL2fx%PaCQAv+RoLup!w*B5d4(%1O>$E{yN8^-kG7BN zBIC++sqLynqeQpLUlNIy>TEQyv*$cW@i^?21CQ8J*gzFn$GaJM?JYmsab{g>SeTr4 zQtT^F94Cx3e)e{1!~3u%JA$2a6fiv7`uAT)<44>C^0bQ{?48Q}r(am3QnWp9)54KM;H@!qop()NqjW@$8Pm95 zfSX%<;^EcekyXd~y_u^Ub)WE%ZqfBySOXt^aDMyX}Q0p*h>i)$z;b{<# zY~0vxYd<;Ih72S!hDrxpYNOBb*9`@FkF`1Sy7Rpi0zCRem7&P03GbuoXNf90Y&7?f zW{YThIi_`899b|vX_VQ2uzT=wkSfSi%okA{70LKgtTDN1|@bmCguHi z_SCfBu?tN)?=>o^tE+$e8dI?iN4k%l|N7pX|Vd{DLaIa zo-$HCqJb#w!`P?3RL1Wr!gC#}5?<#=c|19Vx#d~wBO~{P#=Shk6}AR~6jlY7Q+pJK zY4>#bb8~I7e;#_T*LRh)r1(tgvGSa46P1~VG^|ZHy57z-x#Ki4AoP2|2p9>lywP^%94O+Pin@ zX_N$*$L#_m3#<=bd+Wz3qU(Q-1E-6(V698tTg_wZY}_N8&756LrtgC6Y9sv1EO8#% zTR1z5{mJUmDQ{SfAdPabN$k;mgf3`8!7DyQLJ7uxk99TsYhFyXx8ip7F0qJfS1SE%$7>1ge=j(Of&tCi4`@h$I!wc8KHOw!* z=Xso;<2b3I75Y^JTOX#T&M`>LcRQyRFZ4+*bdb%%bvq{%Gp795KT zS(54cg!ey2UN|8#V^gRIuY-GB#B^GWT0)w#v0v%C zP5}kphxb=+Z5Z&J*H|pAm63@zIhH zTy-aDW}@J=oD)cEErj=3dM=zpNEiGzu*CZs8yJm=A5-P5TjNfzQdtz$+?9P~I~9wIuSi9qrgGv zMpcUH?<0a^;P_Z8ea;3diP@<=&;8L-ab0sd&MLDaQOSGI2X_yWJGUaF%`6JmI%W4f zmY9^;A_m!cO(rgAtL8H+TQRf0Oq$iTG#)b0=|sPIERe=Q5#wE2ikZd#(n6l)Yh?vY z*>$gUzx^6o!vNjVeDQe~-;(1#fq|5uferY~Y>0Ge5%+6Cf`Y?!&Y_x}3J(WLBodq{ zNO6lp;6RM*@3Zw2XVNc@$f)_E`OK3YF%jh zMU%f>%g9TH`|Uq{v2tEx3Df?UYcUOrM}O#jclGeeibPb7Lw!%lqz|y3hD2delNWpB zn2}{B8hT@LOENcAa>phV;@S-oXlQ3duD$?%%ym@X)=cqX8Sq0f+I2&mO?UJg{Kp!FSN1^>*-nz`Z*?m~~l6c#%7y_6ma z+=y6r^k-8Gi>{C)L-&E1ujM1*%rsq$4g%m3Y1!8+O9bF?B2Ljg(6gfyD`nB6oumH# zzC~76@X~HDgsjaL(RuEruq^m)C`X?-{;$X9mAZ6`Sw+gq^6ZP*Ws62#i+`b zVpA#ax3;$K7Hh@+Ck%C%fGLo9^waNGl}%=CtuBI#gJbmw@9(vBW|iT+604>EVQ<(K zA~*cAtgP(WCi18)Eb~3Np3CT5QlYXzn_Jc59+`CSKDzB-%yqvN3ro?fy5_(?qPv|J z5qrol6Y{gj(8~b`lhTjxhAkG_rrHB9jqV^97cIor0_yqiSaLg%o$#+9lr=?8>%96! z=V)9yNtNz>!E5G!7=`bu+|0V3Eu5%SY$?*q(1tzFx!8xVhw24=%C0PY+91_)#F_5b z-RQc3J;jPOEHyf}UxtPz%^MFkBys5cKJs3aQI*P3Gc?4KLa%>PdB$gc`qKb2)4z`q zP9O4hL>$alB4#{nZt%V~@mrhUjgA@^ux3w9NfAaJ#egHn^+b!e|Ed~G`&CfG=SQD0X3!zXsX?d&jy;E2KZ{0VPiwxQ5gUkd($`(C&< zFbXRk|^lV87b9z0k}Ntwla&J(LKv?5F>En6__9C*xkZ_0NSB{1Q$ z;~FDxlQ}qlY5Dc*2Gg`8vZHYR`$`OYRXOj-f{h^OE)L7vAo0tH%q?wE+WGY z_gw2z!?|vJHUOTCiG-vI#P-+`wdapFrW&8w4SBfqHw@|=u_b0Ci)O!7DiKQDZ=tsT zuQ)3^!=l>wiN>eDH{ky6^`K#*<8IhVA)1zppe~({z8!l#8_?>n#)G}|qk06JV9Sq- z{Ksg9+RkFh@HQmZYboE3JGzT|4Lg9xlTxt_uDpaBwXQ9Mza{U&l8BoB_$kKO`m0PQ z3-Y+Px^3|D$0rYqiNaoklt7K~3{H%Z1X;Q8x2i-*RdOT6!Dgq{xyHTDDZ$}WP~dAN zCVB2Hbm^^%p$A-TVWn0$r*0Nrq{HP;EGhM3iCWvVUf#2M5y#B;n!2V9A}cO6fgc(D z&POj;lIY{M4<1%MXt&;cMmQBm+-_N;p{1n=IW$ovrz5cvqMgHh3?hP~i_6i%8GEcr zMl)m<-`H_SF~0kk;Jg#3B%Gjk+l<95y1TMdh6Pas!)S3G$1LCm(U=??SHlagE=CYrcr-6YG+mx{?&P}L9Uc*>YxEE88q-c1 zfBPV%voUlwKjY6fk`1%f)jcm_@K;eYSo{;XG>o(LcTsihQGyq4tb6cXgbGEAuAjbQ z{F0a{?m5%|K242ALx=XQ$Ng2>$H1{414?qGj3W(2@Ck4IZ4$_$u32Posm7I=DR4@y z2q4O|o0;#G`Mw}$pH*@HW!MZ~tbo5#iCu%g`sTF1_Z6Og(6u9+1;PGLc)c!0^j zc)(2YE|@jnk|8IMe?KWgg0a#d&0^_WNu-xgHOVE8l~axP5*2s;qoNu|OVR^N=nqK21gUB=QaE^7sFH8sd7QrTGfh3d zDy=$I&T)L^2d~f*BL}6W4KD@1oVz=2RF<{|FB#^zLt)Yu4N?+4`bta76PQa}4Fi$_ zuR19zRwA*cRmIH00P!i%GTe8AM@8IN_l&dFH2>T+xOXR4$oUU96Q>H|gP}&zn@3QOA`;UaqUg=YtRn1#YM(e_fTi&**`xQoI#Z7yX(K zD1L)3kVKKvcdeNsk>Z`-WAvre+ouecd8b=?s2=^ymdLR6@ zD=lT~$@H4L%-RsYI5xvK`gHU)d7W(a9Ky-d{r99nmgeMSL7`7HwQGlJPv+^$aY+Nx zxqy){MQ8TF>s{6C+iA+46&GI0l}ab#MfTTK1;+UYD?qsk*!px}r{pL*nVu_>Q6ZnC zd^Vqlaw42Q_g@!`7Gq=6N+fSSTfBdp;BN&TL?Wy|jz+X5JiD=N8}#WTJDbj|aJOJm zQ@^D?BR$E@!Oyb(ADRoP2I-jdJc3fZO=$I8G0l!Pn5>rF?$W4h);nocT&b|`$9LI6 zO+$3}6eE)tA7A%3>w>1I>r1P?QN0ru*d>jM%4CAXpg-p}Iy&UIyyF9-c78FjMM6IA z)2EcHHNQ*WZ@1J~O;+fl8`hI@pMfkZe_!;bSd}qgNbvQ}@^F?qDG!f-aTyH`41%F( zKyNR_@7-+XHLPyN;|Li73IHQS=FT{^?p^*H5N95qt9D8=oBSyJ<_-;mZo*b-E3 zx}2|U6FQ4J@Qt41;$>^DpQ=Qi|4?|!p?AK~KP*NU*~Kg$-LtY6PhMKx*?pB1tv91m zH{#Q-SP!vtDo?~>?!27*x2B7<4x46O>O$=Mb15f7fiey zVq$||pMzJ0o|6uqKCn<%?`&G#hl2=RTmO}=rAB?u*>{oC{2UbXwY!9Ig=ZFiY=c}6{tm?B*bRhm6K6z} zt>;6sU?P6>(j$JCL{cT}mn8#OoV*pMN( zH!+2zV7?RQJ({`uD!VOw+$i>vaDRIj_fFNdXqJC74o-2=CZ(wC3C4ff*eO0}@(;|twRMX1!pJ;IPcL4E(; z<}5!Bd70@DUk0D;A9jt1cv@`}UD_qcY+XoyeNQGcNuH2eXy$Mi>mL0Yc+VwN`){q`nO=v{7TgI+ZUi zfovdh=!Q(kT_#NXoys!p`k95O?EWn`Ap->Va6E}uqH5M227jT=D4$#9_L$sHLK!eri>|VRol^w`m&G013>a zK3D8wKUbidcdL}y>A|(KBT|6M(C9@NF{Y#%$pqqrt43gT(*Ij495$Qj(RY!Y;i zK}}){1SQf1AtsUm8*VWy)YBqXtn^yz(&IPj`5KOK2VFLt{PcQE4Itd*cxNwmXb{%f{~7Uev9?f;Ps_ct)J zb$VkMHK9swk<>ZG#O1K}_5vqpA-h#v^j+gZu)JX5{dDFYlc6AvsA{XS=auPqfi+>e;r!c$Cj^8h`MM zb85M<{$U9*+bnF17%mMBAlO=YfUA>G7Chyc$xX$|7#>9@R=NsZNEL~;F;;BIeNIhr8j=+LS8BBzQa zOI?d*?+YsZ{720v~ z0cjwfL&ysTb)71cU)ecMe%v*G=RZol1AQkKel|8+{fX@7n?VgU!!o&}*3*HG7;#Yz z@+Ufp>Ka4@LE@EKRr4?1wok_wgthejl$dD+3fs^%Nr+?!h4eups*<+8zk*I=j2k|Jq*$$S@ge2xq`!lgrcR5s0}vP#p#g)?hW#cCjw(fm$#Z^uAMLTTaFAAM zsY}|1sz-%FXTXWaq@v|}RwoD*#>GqEPZg_XLt|#jT@7*P?gd*^DM#y^EvR+7av~X~ zpj?;9H(&3{hs*3YTJ)jz{nwpeb}ava>^0(RYlaM}{N(wlcLj}A@K=I@KEb1+2Kpi* zSm@!h*$aHMbci^W+O7{u;v z^>8(<^c_|c8xX+}mnSR;{JC21dG4N=59z#xIXeXq24`ny1r?k8&Z@g21}OyZZ#5iH z$dRn`MD!Uu4DP^FH9|td=xUd)_(DN;8sPZ^*xmrNFwZyX^8cO#0qv@bQkPcl_4#$b zN109ZYc%JgU9u5|dP!RS^P82LZaWP!cUI2uKub5dr@#MUF7yKPKqwKn=G^MiH}Ti& zxir}?RJm{Ot`RNKJ@>O3>{|^KQk$MG_Lisr*yN@VhAkrBj65n6#tnQej>PEJl0TA5Fs`A-}9hc9i^jS-vcsM-s3S!18w zxMunOqp+R(OF9|yY`E?DL=WBDctvmc$^v_pccmIfzow`2QG9g@ttHL}!TLPCGG` zh|4lnh-zFSmyX|Puo{E^dDkT;fq0f6LScGO%opTlLEi*@dex(pL8Mig?$`cT)JPko zi0m@g(X_9wl7;HB=m}FIusr*5uF8;K2Ue~k9%bkYIC>L|v?L_SSE{tRAO6WNN=k^= zcN?-P)#PjdMA|c?+pc-qqQ?rW6+z&Yw8gfI%!{AZE@Yq*gTZuWXUB__S~1ZyPju>Y zSt3k%alA1DPdB7BqnMs5R8Lx#)aHAgtC23b323c{bAEttd0^73-yFKR3xO4=lLu4M`1q%y4C}6Nl<>N)-V`SWM%)ORh z1%&nG`fkU<0O0nF!l$Ixt82S1jP9EizO6M%JBaya&?8B5Wm;G3=}RT9wlfpJoo$db zDb+A-)7o%pN>=`P5E$%1MB8ef=vjGleSo z`1pH0U$!rzW8?3`wR7&G#TR%YH~S+|_6>Lb@n>Y9Fsc&F%P||EMm=+AvRu zz(iT{;S)lu+a1p(Pc_H_?gu*&wCkQDqde?ySa)B|pDfi(_a0N7UUb{Qh0&&_Zdc9k zYQ}Ydavtg3?@qLixAzF)zDFGR>7|jPV)>HQpq56Sid23f9NuWX+d*(-<$ux}v8F(M zn~kp}63wmwot~T$XsKlGH5xv*-)6$oL6Fj@$f>opH6!;$4sgGDAJMF*QrUT}hu@s^ z+R5$J+VI#cp4my&2|UchEMbS^`!B__G%%`hzZoFO{)fp@e<_F{Qn8LLx4C#|&7N-7 zJ{nYfo5=adsdAf{7L{k4r3ay}bKtu8r(x1@zqt^nAgrGR{<{xFBD%>f3m>emXS&YKfJ8)UOrW~Ky)GE_(!cS}AGYlF z11?d4(kWD1bk#L^F6FL?Wj0Ni0Xc)(A%Fa=-S`5GKF8qUz0cZ^92Ev5vX{5comFR) zA!a|x<`xYS*ELhg zQ$vlc`@vmkHrCX&RuAn?`zFsU92kdWW_-O*5<-D(`URvIfpBUe15V&((92wBfEL`8 z+3&P&Xl8aZyzOP!NoCl%dZb-Pe<={ z#UH2dRA4>mUhGVmk-9b;EX%1UGBbtCBsvIK{M~Heeddr>=C(J}UO2<2SjYN0M35pz z9SQ0F3-#ET$UB!Rw=A7~QuY;dJG!pp0>Wq+{LUv?co9g*n=A)`^pd4}k}B@YNnNPK z%X8vRVO^m%0hP=YD8}zTS5862czm+mhq%`0=WvKIiwa92YXMJO4maC^| zG`FU;{+xoCvuM)QNFwTZFX>e>d5w5Is$+A#v96GG{=jY2mZnOK)UlewVW8W(>nW+- zrpy^8j2hxpTd)x8$;T<$@aH{EnvOj#o+Gh#p?gX2VsF1Vao(62Sk%_scBh;4_SJf5 z;XOYe8A37~*QK@sGgmw~^i)qr2P!E!3}*Q&)pXy&sDj9_pJqZ+ze@(a-51Lf%2WHj zJblQ3OMi83j=Gf7sZ+}?l=05p;8p^YV8&yL>oG1yuT`Er%D+{|lpw-IA>JF_pPPL? znEwNFJ!i}>JY%Bu_ICs$6_MJO%I9_Rn9?^?-?qkXEjznTY5IP@(itOaD#y(n4>=9S zHVmuFQ>2QV6_{-O2#?FR)tw&AW8>k$?e8{Vgtm*9$kzr*CCCTbZV#e86!k@&6cJCr zf`eY&Urs;n4ERn%8S3j2+$yML55pv7sBxf)(NKN<93Cgp&@PG4m}kIa{-!!dBA=Z@ga_C9ghgW#^z zKS7KGc>cEI07)SYm9X2d;f%Dbgo^~r2Cgqa811Y1qLPDWo|#u_cj8jtOD3}thDDm% z@=?1ADO5C_l(jP~e6wD?ru$Y)Qk#{qO73@@$R1&EXY-QZQRzm874JsQ;KO-q-E5Q9 z>tpG6o!HKbY{vT?B<#WrUD@vcDir-dGk)lRh<_k6(|uo%lm6@i7BQGr4aF>WvpJa+ zrTz(o3TQ7zTT?EFc=WwIfE7-~SB8h!8F8}e))jgk2Q-6hf9OzSdv+Di=4qZR2$0?d zix1fK>gpLQYd~V#NVA(9E9N<+=y;J<*vpvy(_|NsTMkd#7}L&(n68^JNN!qjCUM&x zJUj@wC#n6EaEYkHuO{NCn+sVG_@|hW_7P#&t=EN&cPN5IB~RawiBn#ec zj|*1}-~vlzlmsjJrtIeM=1u+S!o0&`m=p!BR?E?SA_vRvPa{0cl8wsaw&uc@yA7R) z%R^A-%-c;Ahd^*m84CAxUyh8>hfP1-cfFrELm$Hxrz#clbGF7-tNghrz)(nL?6jH} z9m%D5(u_`aCtEQ;TmVJC(Ga3ACRU;u^3y(sqr&6d!a*@YYSJx^dL)8_xolbUUNFw` zcBgnC_xG}S^M>2LDQu542|KtfKQA|&M^8YcpD{}oQv_=fc-`iDAUL~Hd2v3fGBmZGKNhvD0vkH-tthC$!-Lby0V|Wt7HK#l%oN89(^Km0X#>S-v2djT27T5oQU`e_OV^B;R*s4ql#5vs;yVhI_v{-7xif zJMcgPxT3y9W%_rFqsRoou>^vvHK9b zFM3i-5CHh_=W~WKELSBPP5U4LIxQy`MoD6rZC{z7&hlwfxvNtZ?%NY*kxr0{^&)8r zY}NYD7c9wPD-5Q5xjJS%2!(daCH%=?i}VpinfS`jRqE(v0VErT7`CPof&;&S;576+ zq*@(-`zW#(T&d0YKRq{ow%|Ylm^O%(yDRqKubWm9>(uNqHX`Z&mqNG<$g^i|x-%oM zdZV=E^(sXI-C!MwCsD`!z&{LTPRVwLGU}U){}SQtGq!l89g;4X zaeo`V97-JcCz-K@kq|YA7``9u639L4$ICVmTf1rFwQMc}rM_SVY|82qriGEHA%gDjjF=UP)yPzMeCqPxWH{vd&LI zkrQ9yp^TN1pbTCMbWYXTdZa;iBB(|q&do%zTlAXw+OdQT)j68M4X`P6KAYm6i!OKy zr;W>gzMBTqCxAm?il!3T4G-IIvFPibxRK~^^}AA0%F+fRh1y@C;n#z2=#_rOIA#w1 zx*s(BPezP6X=-z~AW%O|hO2b}V!cy7GE*2B8BN$bbDer!UOoo~fq4PIXN8W}oXzte zPuB*N+H5~{;^_Y%<)i>ycC*&bT=-~H?aw8A&^Uz4Fer*x9zGhok1=FNf7T}A>%>y z@=qU859G2-kcffK-mcdF2?a@kAV19qS-9l6EbMg~<%E@UX z?b*#O&3{aLQq^@y9}M~s$E32}mrZ*@b57Xt#x=HE)>1Nz*)gE^pVkc3Q2N&MmOtHL z8Ha~#Fw?mu-!z@&e~QK@3$oLg<*TgS6qjLxT>orynF-)&sk9zfX@i|ZuMEm7P?Sn- zJYB0zmWOXp+aY!!F7`njv(8sFJA-*8FIl^nv@tymLOPBiuY&3b#%RCB<_cL`;ojCe`yuU$>-P1V*m9#N=MdfgrMmoWw5P}= zD*M1BWI+80MROh?FFN%dG0F$HQCT+3?Tl5PJ-2B zci_G~O5QM7Vj0)D_g*??DZm{Kdw_rHI_$&Lyy&tJUPR|N6Wi*8QIwZQpSAQSah|W# z!~izYL2*2)=VAX{^l{X{cu$61;qw{si{G6Ek(2@fD6{U&iBeA>iDJ1TkV~t=&~xUB@5%l=8`+(Iw}COsQv-$d=3aA{qN;91GwGa5 zd`>f?s5OPpJ6^SiD-pR#@t6DSY0ZOa4bIyWG=JNG&a?zC`%Gg9C_k32=g5&o-w(ca z{gDA#Xj=a>%jABx*S!f7-~VY9yH@+`ZEB%X+j;2S<~?1__laNUmxDZ)ASUNua}PqA zYz%`2Ey27eV$k**yu>Uo`{FWP8iV&%Q_wa6= zUT{V&Fj#Ww)P5lXjwjSNo|le52(NzG`c3rspo{@3ecf`h&&trxPU@AB0lj`zn@5)q z#03gBZH4T}7x9~4=xzNojr6*xe!TBfSzlc{bXuA3sG*bnqlimiNBqDvZzVQmr=fF_ zt1KSzs8h!8aBTr?=-?o2ZXv(>d=+gM2{V$%rWSESKu6ZGwbsBNQc4y@a%#Cw;x1>_r-TAi=Y3lA(c2kZY7mSL9YpZ zt!QiN8Sx($zevAz|7p7aiNvMg^3E+QXd1V3Ly)vhX~E(Mr_RzB-xT+IWqS!%B%dYa zzn3hg7Cl8dA+VxiVtRbKx3x(fXPqWOwIp7V(etqJ1J7Usfl0*dYgbQ6A!)ME)UN0E zsjnTM+!>itzDYt~Z|;E3<=3zi2$o1i=gnt~{n4;7kWI0B{9~EP(@0&r30Aw8<_!TW zQ&HzIm&d z|D4!piU97&yh43xs{Z>c-M0xQf8OQZt5p`-j{{R0bxqxhl2q@nMkiD1TkwE>15$8x z)W-Rk{1|UzMETI$D108wwtQ*BS!h*eJ=3;fzLj4?APjrr%K%^Ro_AaH8l;=Qc_h;g zIC;O_*5MnZ^968Nhi>ZK@Hh4XdhGN^np*oc`1Z<{BY8l;mrdS2@M;0HSm+_(^*^cn z)ZQ6Mp4O|$X>pYD{=QNEg1!tldEBQje>X<2wAFTB)t4c_&HEgDzpju!r^_F^D=uvt{=7!cd@2qtMzBm(BfaKVgX{R9s-J^mQ&YoxT^=C6J~h}r z(g@Er4e+QRd7bOcpD*CYM2JaM;D2pt(5Gs-(NB4O`F)MOdB9^#zVS!o-jz9_&eh>o zKw=q8*J`tW=uyUPK8aoT6pTmDMmQJP6W8n z@`@Dw-yly{x_yXIT^jrW2Nr_Sph2h}tFAqc8bhNP+VDeX62o83ZKfAxGlZ7|chVOW zVJ<(+s$4eoz1C+pl9Cd9$Ht~B4AF;2%3OxEDys1&%~7Iu9RxbU!pkau)|=^1(MjH@ zsj{c&yWt&h_9?g4DZRU}qfpz{eyvI|^h~EG)tJP+NSp1G8$;WxM1hZKB6%LasOzAl zuwZ)d+4$PFj%rYWrHoWYll5Z_GI(UJ!Fb1bp%}7U&$+UdFRw#T1{W?~3dcyWns{V@saB1=WZ1jJBhtzVVOMgajHl1N`wS>20mb zs5c$e<_m6HQ+XThVf0kMjIE@#7Wx6T9^Uj>(J$cqei(ymdZ7)NRNSQZo2h;h8TDa_ z9qevn9IQbX_7q;sVI$UVC+zqoZbBbk>_A#*N>S#77?ca(K~!lE;VUTy?7I|@v>{S*GLHC&*~KwZy3pq2Am|CdizSv=j# z)i(oWVrzE8xgM^Wt=Kwn8|vOaoV?Mo{H-!qZn|XuqoNlLwwsNxE7j63xDAi%wdlVM z_uQX)uHjxj5n9~jW(u7>;(12+K@{0bn~#a?*&qyzg(X>s&^*j;aQ!I2#Iyaygb9ex zGI@6;r>*>PRdtLV@GqN!#(xx?{3jY2YpGm5ul@G8bY90;{?u%kr;|qA?xAlp5~2+_ zJ1e3=;A$#cSlA-S!sT-RBJr{v%jaaFZND0f5;=8+j7Pp`^VQE6`)3BMJUSAH(Fg;v zbA=ZTHYe5W(vM>!h}TG($NxjR0tbvLFsx(^cwq(s#lKsy1;LrPU0=k1A2qlQm+ml0 z8}!)VP}AfzvaOjfFN_gL!}jc3Nr16KNlE6bZx#6OkCPg2~(Oj!Cw3r6d?kmfpW5MZ?-)+F|KM9J6Oc zmC~50r%)7*DdJxEo9F!vZL364bWVPQ&%?XvcOfG=V0BY;S8g@)lFK;1on~d31bN(` zqfwLJ)?$Mp7n?xo&q8zhV1H84{A@kaqZO&-4`(67syF&qB=C)ZQOVCQym7VeW{fy+ z38&g=+~XUh*i~QskE;&!^UAHqdxr^jJmcd7e%T0vL+Ug2b)#q1#XoZ^wkGSA`PXm~ z(^Kr)hAn=*9sCLbIyHYT`p~6ro&7qZh z9vOj2IAc7~>x51d#NpdV{B=Rh8P1a$i#)vO^Sbl!pesJUH?8futoOySi>!|FQN zV`XV6aWc}Hh2QTy{}{q4FEhU9?TYYhT8wpW1cMWguulDndRGb7e?FQ|Ohn!IT0z5W z!cUFeStUI|dhSn>DQ9QzyFikY{H6yfYY ze9FdHCgXqY25|y&ucIgM8tq)n8VQJ#!)NEtOLej;by^>DA?!L^X8`dz7v=Niy+H=# z_-@Y*xLb&CEo%;bj?OsTwzYdAzdgfR>062Hr@%Lj9|n9{fAW83N=cER&HiVj^<+YS|pixs;g# zEfWLuIs5HQtE8fZOiTLfJe7u41(1igy*z8 z=4HEx92WQajT3pIW17iR$VLh<`E5LUEQ}};poDM6No(3yv_G8DEq~F_^>$E zdV|woNF4K6l^nIb{a#H>7Am|9Udetg=M#EPjqk~V%XZSWMICEq!7McV&Es`7!J*^w zLurkK1i*j+93nC|KEaIr%>s_Cbthdvk1L2VRI1(7tYyKCkW$)ZaqcyfcD4;L-T;+q z6@&g1)qRB+6+VA|^_$~cQ2^3<8{Dq1T~$VUtZK+)FFR!vMCFL_vWd{g%ByKw;3z!OnBcJcMDAfU~evZ?=$5Xe_#7hsaNCE_kgl{)kU7?xgLK2#+n^w*IiDg zqxoKK999a`ehC69!7j=g$Ce7z|3AGNLxb5~tdJRd|2L{C$Ynt(I8L!r<)!P>ok$YWo)Kq?be`GK{h=Rb(^BXzsf!2m%e}pLw#`7( z`@pl3*Lvli3KlU46785bv+m!rFD_HUgG=Mv*yF&i4Ll^$t0+%vM4GhuA|_``yj z!0x&Uv?7M;<%CTGSGwT7p5()){j&#+rc*9*>~}`yd0**4O!(nr?u*NAv%4qGrbw*3UuXDYAq4glFSQ+w8X^NyTzqy zYnrkW4Dfx&ct9}@%;#vJwhUfXhb+!dxcfJVorHIp38XnJrcQo>!{g)CnT{(_0%6~{^P7=5cXZ+*;GcNemRyVmT1Qmw83mQz;C zE}vSlvF85Q&d7YvrD>u1EWUaSZHc+P`q+3o4_}VHpxOJ7j74_I37O_AB*(^fK{#jf z1+IVjT&8WvM_r=dkY7&n0P~s_7wWQ5ZW#gBlF*SK@aHw&)%m#cDdwpz` zq5(TIH|f28tqzNqK4a5!LRKqfUmN;|7a=jE3{MtfoOF+i2VYXyk6yJJm^RD;z_OOuGj|`>_lTXZ-VF?)ISr)Kk)eJRp zKP>AX7C zURU@SnYw+37!a`?xFzm12pUfa-~bajb<`1;lIp7m{-i>`e@Vss@ot?J7ItmRDo6PM z1U=-n3`s}@hDKZ(R z;ikL{dr;YWyz`W1^*=mps8Zmke|R~W!$SW^{xs64^~zjvlf4?Cv3NT8%I}JNFLlg^ zni{Sw(X)mn$nfsSBd}<(y6j!q{&31OP6ucI1W-UH$aZV49bQ7c;xh$Tl)^ z>LpMn@L)jXMRnQF>IE|XZvk}`=1LN%1>WIIZH>A|ylkj)V6iyg#L5_DLJc_Z5&G8a zaRZB(1(t_|LIxEU3Y0Wh1k^4j10#IpALdfXq1-sY zTn;TPL<7r2tV6jDt$G%pw@-?>~mo+KSXGLsTB>5I!-clW}Enw_gzI2Pwx z;wL5)DqHq2YfqMjjq2SD20{HbH9|%tM=xV5CA3+osj=Fff%g2(#Tc##IhkDwz#GKn zTV;A%9;|f18Le*#otb?^4qcgpJ!rM>%>r$(hfqe9_3;Q(k9O4rhvAtujQaMCpmw;5 zKWkX%wF;X#P9{&pR`dn9^kJPEwT^?X$`Vs`dKkw=Uyt3XRy#=y03Hj9thCSa11t8c zro~&&Pa@xRM6l!eFyMiXG9UYK@$Je#aZGt8W*wO@Snji-)U)1|E)=lU+u9!6Ikxx@ zw_=8W4p2AEX9iR@m~BKa`SFkY4B;1jus{}87#=7qM;q~-Z8JsFH#@giMwrrwf4~f7 z90B19e1nmc9DbW^BIU8wu7*jnSw50gvl%2C1fU^X#pZ@SxdGML`bPrr#NcBG^gaNN zJ%>%*5$sxn#2I!v3pl*o_eXtaIGM}h6<{cJ z#MCAs&(IqT04@gk61!t{jO4c+49Ve-6i3hVo<#tj%KRX=j@&kTsgcmUCvH1%P~>;IN27_VP`qcD z$YJR9Te3N=AbT}duF>UXP@&Dm4n#%CQB!B@2FM#tUGc`DNeA>OEs4v#L|Ftk_VgV6 zw!?3hTe5wvXi?%rsW?94!mo@|p|J>1e?VUaG51C&YT66P$3?Z5l)0Tx$O20IN@b-0 zeI!(T#aeN)V_BtVhz@eOd@*elFm-#G%Lsm&>#F2`oRS1wh<@Tu8z5oVQS7>8j7(m; zO14yy5)tKPz(G@ymi;p|@~-E7AYfX3Qciv5gy%M|tK>OizCu}EQ5eWO?Zzrk3Q1qlAqZA)g)bi+v*v9gc_<@e4ZkewkQi1Ipak zZ-aYZn5zy5K7lg_A0_a$+vs^jd0DOb+=T3Yi)X(GZZ2{hdSzZ)f>kgechK@8;6zJM z-@VrWBeCZuj14gIP}*CTWnc-HVR_!%*=FCKtIanD`SmNbp?-e%|C2Q3d#i9G=!&wB zkB)q=^hSEU?b_ivZsygP{6G`M$aP{>bo~g)>Jrcukyqv}1AKSatcFvaCEvnWC?b`b zwxR*1*qT%3c4Q@;H#!!Fo{!om6lgX`T#KJjuTkylt{w*_4vs+^LA&?es|Wp+O)eA2 z3oR|p_1_*|TTMj~Q{`*-{*@Br%ouJH`12cPH53kQelvFS28mBMD-pKUOL|}9;(%>+ z=SC0k_xb|X7AtOq{lI0m;q+{&#AJQ%%+-*2*_2bVfrCXYDD2VQvQZZ`6*lCxzpEBag9T%& z#y6m{paT`A@GHIP8*AOfQL>^o;Ll_PKtnC%(jKw~Lvh6T!zT@)&V28{2OHo79o{G} zDXFL^D=w)hD}nI^lvluD$6-t|bL;tRmCYae29c?$@#@OJwmmF*z`gYaY>%0Ur}Yi% zw5gc~E93b&$oZbr=nxVAPtajE!8~=``E|+7_ahEJDttY5CUnMYL4yQ2+v)*SA(X-R zY4md#HR9qE%TV*?idqjnc5Nf;XLZZjSUBS32d(3v%)NS0A-Y zz^u6fHQr_OPi&_LRZ3i{CJKW)9FGA8g1&)1&dn)wVw7*2_&h?_kTajPKR3SQ|^RQ*{wxF<+<2dzKA+rJ3;;YrH#Zc3O)( zhD;QmxoO7!0hUNU<`_-ToSTDR*^lwNrw))@8Tk`mm@{?J_s5?Dr=%_+E-ubdRP-Sg zPTNoL2fa^{zg=@AL55wPUX1qC&i2p;HQZhOzl-;zg!6#)n}$3KKmy`Nzi~B;_(A55 zd)U*5&4FIt+SPQcilJ6p4$rSOknL8F?;@VC4ki|Jz>=6LI>Dkc?Wyl6`tHd+lJ!4N zltOl5{s{Tw`ooL+A{pOa|7&{j!NrRwHBMwjgxt{x)c(%;$DeuM3BPw6(PZ_CIIDX~ z(r^B5C{fvZLF(_Hoa{=IC8U;rWY0W4XgH==jf5OqM5A?t9HReZN%&KA`JrHjf%db| zORUz2VSWj_{b6kc^|rz5k&rfzFvjsyjS6*+6PsQzBJ|^zW3LCI%p(}zn$#PYBazU9 zRZT6>o+80o)tVdY*E+~55ZL!ALdg@;OUpi(EwSH!INH#yY)8q+-S z50->4Mxyck&(-mA_jyjV-MhvX6_I$xtlLq2?T;The$d#*iii)Z_#Y#U@_b5G zy9Xg^Qf@5IsBv0Z&C*w-{i7SjiY5mK)AWKWE7N(xE?tV36~ZVu41L|tN-%r;CM)LK zn}H~4HnD>IM(B`NoxA);>RlywiX?sY1ohMx29L5o&OTSzN}CjI`y~%K6cWs?$sJUH2k6Jy<=u- zSq6FcZd-Z%LnxBReZy3EZz;i}qk^=$+PDw{Tjk?bM%RZ(*L$<8X4pvPeQPKzgrKG%0>LlM z&HF)jG?vnri_WuTNz{O?KUGd&g?{h+iIZy=x9zq>wpxd!tiTVsmj7UR-IlI-90i?p zug)*u{&{>?X*ah;ZLPfYOZ|!zH0Fw`WC|q|lr)IS#`P{)SN3|BO-ziW4sdT%L#Vu8 z4dGgMi;VSV)n;S#p;BS=q2@^l zgTBvY(x>O;@9(s{dH~$&zee!;_HVCFNYj}4$@u_$y?VO4yF0(2fFH!52}VzhpBh)| znwNS$NsuVms5-3V1oQPVS7&8l{_VQg)0!sPex>%pl#f*&&wB=^L33%^u>PrrWY1odhzTZq)jHe#ekz~&}a0RMbg zR}$PqSwbNg3yHRRIm2yp>voqwmSJ2rBH-`8+>)X*@p~I$%{b&6z^d#l_`Fbb5&jBV z2Y!w_7jo~s`=t|NC)=!UQ?f>WGS3keN(t4|p6In=boQ`|EGW~gasHxVo6$$!WPvHj zQt-4IhFF}qo~)PEGWSZx@T~wCSZe7=o?YhE&WCovt5JjR*g4yEYZ+l{pf;yy`~}eU z`%`J<5V$1uuKC>>3DdY=WiN`f@XUU9@ea#B_YAVyglMcyo`X801fMGZ&yIF_d4-XHP}=o8RK=!RNoH!NvGu#EPpF`+LN!E z-O#$yY{XN@e^Eh9Ao%w$34V#59*Hw7vz*$jcGuYCIU?P-I0T{oJ^d0*QyQf%=T+3u zie(>$!9-jzxE1|%;_uV-+Lzo#Y1d}%y1PKk&sl(8@y#A#x^GLbxlb0~oRB)rtFY_bmNswC{LgpejQzTtXFZ?9n~(@vFn;_x0)BBG zOlijA>PGGQUhoN)g!eDg5!MNRf)?d0uUk+5U-a}m4klt2b}6b2-uQ8VTWu|*)F(ne z!oF4l?w1I+TDYc&n`E4#yf2HW<%2(km6Ix}1p$ka=F@4(;kGy6&qV~%!7 zb}S%Q5>NehZ0=8H^Hu3TP$whwI1K&8Sq-uVF0eckagqBTsgbWtyCyDaT69t4cyID1 zhnY>5R+M7Lo4K6p)>Fp&zmUgSw6XeCqaV+Nl!~4f(?;Z36mPr-%L9_d7laR|wTYqb z=h@goRy0b#n~Le4Y?EG})NUZ}d?rY+l(JRv8myF>>4d+vVKY%urycy}ek-zam9D{Q zKPdzfvYRL=kVZ?hMOQAxz1L44`o@>=DDP_L360=gk2h~LO3lx^UpP^4s_C+}-+CpZ%P#8UrAP@Qzo zF3(W;_vFgZgQ=)Yki0uOPP#uD`(Z$mb(Z@cBF&a>dM1r<11^L-qf|b)mbma%wK;cC zI-u^Wu@ zPBeYHntMy`d}NkwR>#Es&}2c2AbJhT467oRd8^$^oMjkAQ*{eY^9|hgVkECAh+0m_y{g z53lG5S&+budQha{!M)c;A35GeYBW*nW>;d20`k8~ah<^>={TNe6TNtXy;S^hmI2Yj zBhlK|`nHu?yXw}YcFqtcU(7IXq+CEzDsf0d`o?M6NsWcW;86otk)5vRyxM==*L}6e zZeZtQ`Q29YWk>pg*j_L?3nSzjdy!1FZ}e$7@hs`-ndf9(UrynLZq3+~(tX@zwdIi~ zPm}b}buHyM*IQhcQEg)ejZX}CS@KJoJ2^fY~va;E;3BP-IoKVj0n?TZL!36>GaAMwWVU(t9ir*c73@-?;) z`}Fhm9WCXPuK(tcM7Y+V_<(WD?o=HHLvK6~2wI3Y9a@PT!bP44(__=a)_QMs6@ik# zqdB`<%A^@zR8WZf?)Je(O0r%~OWJjNPsI_Gmh&&m^FlcgN;9 zi&?TIdzM#1Q(|M~irl!>#W401NTZ+6k_>Xf=B>|9_0z>OULAus9;IRl!8gLr;c`cW zs4Du$5?0HMi1uBHXI?u#R%w<=U=NAcLL|f&gDz_u^}CCUee(Fbr$ekng8yB{?q}`l zuyV6Dg=%cZ*FG%YYUfj@j2HqH?P^{?-j=!}${6Ny?0|mJA|92dNa$=JxdjB~Y%03Q zJ(mI1i5UAGDcC*Cu(rs3$+F#hA0zw{x^~z@ri;;#~FQYD!+y7|J&wqZPUrp z2jfM_6z`R3bVI{ogm4-U=)PdZeX5IC>IBsgjnB)=3z&-#R>1iT8?a{_E9>>;W!?$= z*2?)M_>8jspN|voHk7JV@y;Pegwy=z`VRd6b~f?4X85@rGmGjPGAR?ChUYxztZ@qo%PDjY`;a2A^p75 z)s{At7{+$lK%6TvMgGC{p%ourUGOMLw!xIwEw>L|2k6{n%1-}6cY^a|v$QzZ8Ex7h zGI3oOquPe@YFqC|>l2szFa$-l<(VsjJ2^k|4=;Y<4gVAw*}b~zyf8oHwIR0@LBFl% zJ1grBHu#_dIXlIZh9=NG7kiUfue|)n#Wk$;h2Fn?o^dnKCFI_KXWYd&NSyeMIrN6Q z3iI<{oU67$PD8{!wbZT$$1N_n%LaY0ZY@}Z?^RZ4>bf2hra2k(eeFw^2I1-288^AH zi`>}C781kfKQpfOphI{1S=auZSbW0)K)$;NFeHxvT>=^?1rROFI)HG%bhB~N~#6HST(YXswkWZt{T(X26^^n{y>a@WV{tzLZcCZ zcyo;l&84+;Jv6b3pn<5}SdEgpE4(rFOz+j});8NBQUW;H|GEk0INZ)3=R4kK`C$N= z7J1MDQAg^HkAV`YVkL!z-SNdL+zl(N2%@#6r7^C+)I--ipsiU!geY<7uaG-#iO3Wy zsSA!(t;YU#Qb$1!WZpz{XqQYve!Q0L-^X*;OmD3Z>%jw-&nD?)Ke6za`wKNSXz4E| z7O%HgOf>Yt9G57CORD)(4ju_ z%8AK1ZaHm%M%M#%5flpb@Ibjsnwpzm!V+|ZhLzPu3%G*v5e;Onf1ez(Gqt)t=Qgzr zWaySxva%2Qw>eiA+-gO+^@pV0KB;=?`AV1Ip>Of~+?=qDl{>ZHtl|Eo!Lz&YPOl)V zTNmrmE$~KV)W85FPRFV`4U=ecigCKiKUL;%wu2kF^%iwUUcS2Wj?{~q1RWs&-Y=P2 zKIkY!qm_|*HPv^(j1J{F8SSn5?&b-%mK-X2MEoIcmuDmz*Y%rBjeW`uSDAE|*ZY{+ zy++={shPH^njXK(@aTdss&_w^8JrDOv^cvJ_4@{nx-r)f^|}9`?1jvv;xtRtMO&rf zvN0tEf*0XilbAkg&{{lr`R@qzK41{WCVZdua=_fQ#{@u%$7A&?_B)0)qd07?1y^K+ zX^46*y|cR;^kVPh==dR-z@QeD5cjrAx#wk0pn5+m2dc`Zyu0ZQiq6K~jTa4GewabY zB2zbX)Z$1RdRYdOR>ey?olx#=+|z@iJ0=Tn71T&;;+>ij`ZIn=>(|R$Q~@HDKbnJo zXegY|#KhRzhdPRJI~dbNjR8~8*^ylIwhy-((b3HrrfzHm47BS98h@(YA>1bez}Bu*bvZQcbM9ppMUlA)bx~+va*xyz<`q^VKU{xP4SZ4&hN5R zIMmd1ym@%7u2pKgZ(dIc6o$^xN7)z~$9FwP*DG-!e3MxJu(Gis$pr)T8n(2b3>q4wAgzDGq>I$yMUB{wtB0l_2N zt<+{K>QiH1UrRU30c3hwO{ye+^s}+STk!pV9{xGCXz7U=n_8>7qhM@oN(k!kh*jPG zhu&LXTwHvEV^TRj@?L4QTfN*PYJ^km{n7r%n>AgdGHE2;>;zZu(^N#DQ z2KR6cq{cF!LRzy%=)i`l=HMPR#&z7sm z$I$8;CN*|kL4E`kIHZ7p&3lZ>VR-p?fsDJEJ1uCN_zP4jU@^;XlXDk}qc3_1Zv_3g zR!~@Pp$R+SE5U3p@gWYd=~AtuRy|cAD_Df`fJJ zn8lijkx755;(U>U4Sfj%Rin2e0&S?@?#E6%Crb<`<+5s+nu03Ng5`tlDQc8f2Psvi zPM)QP4-tpMRW&_I2`1Na*3jk>11YPxk&*q~loBR=R~-x=VVLK`)6aZ+z_Sp+v80FI zC|ektele6JEC9Qk(!xdtPR;PC?d)FA--q<94UxE2nn8JiWbL|EK@{9#T4*9QRUm^8ym$535z|FO3?1#5nheMQ&TES5txr0YjLO= zmY(WbLZ`me!RVKSm%Ssq2TU>?M3d)FnA&*X*W?+4hBD#5!G$oGotF3AK&|P{2;CdP z^15FqRr78ib`1opq0gG{oI#W7NYnE#^xSX7q)w>3G9WLD6d77JPjApbIuitrMHSg6 zhx=&9oV|?Jo@+?q-Rkj`8YwoOALC1A`ddS-qt0L85aA*p5@% zVZ%aW+{IL!Zo)supCxe-vWg4yX>=4*tw`>QYL!I(j<7t&)|N-HY~@=^%zKplbBbJe zY?6R_@TMK%R`i{S;%T>o9crJTC%<~8TXXLr7)Pd7QRttt^@Nm}SEE%5=lIn;TlZ-Z z>}?K>WSn!HmE>wra$g#($&sYzo;>lyA7WsHi%lMp0kaIgE(rSeq;xxLHtUrc#4tX{ z?rv>TOGiJCa?!jkGoUfQlK0+>(R+wy2lAEzvsu2SV+5m6w-CWi0R1>3rxjKC7kj#U zAk=BBMaxUDbdAMs6%y5vr0Atrb)YLve%^UKNL2E%wL)}o!`FaXHUf_v&zEipGnI zNkQD5oxdv1e;MvqS}wgY&&PfIRN>3Pg>fSzqp^Y1Pkk>k-kfin`yLVJM{p}4r3vVU z^4#nb#6MK|ZeJ3_(ZI-_KG+kK4w|ZTmrv|_p{%Uja@8HOcC;c;T+qPS*qGvytK`Kq zwi7SV*cr;~DLzk?3eP|l!}}nr$gUi24+}efjylDzKrhP99>2%+G}iF9@A&k~68bq; zSNB5V^j^~e39}YsIj<2I<~b7YlQR5J8qBIU*nZU0XSvV z>7CutCD5YAc8jf13zb2GYp7VUG3TE!$5CHIEwS`Qj4PNYH;=r+Leaj~i_z{EU)w4wBxoQCvKhkWe1!eE6cwtaIU2G&`lLDk#`{-h-7tur*_K zZ22UXLX2~Db8E3LL!-$~>S_f=MO8UNvFPOvZx5fuMc((Mf1$pISxoQf#$3T3T#Z>F$o!Uh zgE#Z3wKcg9g1WPIH9-s3uP-Se4_~h+`Oxqy8{08nL-wd?T`>QwS#q9)0pB3+wtDdT z7cgOs(9BU>T(6{!vUYU1ALOP@E)!1OC%bvRce>T787B=dEdgPrHQSlcv;d`y zb^{MoBN*oP(`hNe2Ogc}NwQ9rH8r5Em?My{Le0dpxf>p}*e5J?7i4a?3OZ^V&hOAR zwj6|uD)6T;Fp4BsvrSb{V3@oWqkw>b&~R9G6Zqw~w4F8XcoDWmr84f#fxkb24Uk9n;=U8vczY?;`&#n6 zaH3cg_9^ofnIs6?CtQk;2a2tI25S(eDyy!dg1ng-LtnxndbqchgBA*o0tg3(`vC#e z5`@=^wv-xdkwa>KJ4V?TdWqxi{u-7>9hkDT%v5sPl^j|zNL`S|(m zY*-)sP$xAq1);iWckC97!@(`Q@y6}Zpy}yMuPa^w23Z;xL6C1nEm(7N4FrLoDG2}Q_ri+GaUQMMnixQYKHnAF-_LENc(TH#Nm=3+mPmxIeB%kbx3hz!{w~gu!JQ9fnswm&#?Dk6# z6_=m73N|%M!K?tA1PMH;eA<){0P{COu8Fh$kjc68^J+@phWBi`Zgdd{&>z7@|)O*1cIg_cNfgt84+D)cH64jhWJv|u7(WCFBEQ)+R-dJVKC zZa_h``3PY~<)`_5*CXhxY^iSbg>dMeLag#iu0x}&Z}*4|#;qedm^7B+>F)-5Be?rj zNHo6ODH8_T@NbzI;-PjijZn(n5zDViXk6Z!eUGoIQr;+sd3$?%pwvLhGoUS{GA*0q z3qs0q#4|W&1{&=KM15_eLGmfq0r8_sN*R)SPpM=onA{bgK-!4NIAgn9tb`gw|4?t; zSl)p@;NMwp*+T^`)_F)29Y4jkPeKSVI&jc0#jwoR*O7Wy+P1d7%5EqAXj=@G190FW z``3g;18l$jOy;%3H7ozvF#ow#QkviH1*JeK4w%Wz!VZ6&6F79maTG@2BtQhUZ8zE$Uxt(SCn zu1EnEc2iRj;ZoeHj(bTo)K^L9Sv+_5w;M3w2X5NhJnsm!-L6=5+B2}pxJoay*e5RK zE~U{(LG|biks$VwkiZV6?o$}{=M|;+p z%;w;i_5)(50mPBx2{^x}kDmQpAS8bg#6OLsUruxBoZL3Fo-W;|w&h#C$ec7#%qL|A zeh@UjR{!Wj34%)8V=X>!+$9VreR#~?R@2c3ryw8KmFL2Kueufb0!t9^+XoWMSN;zj z@2r9*X9&e{$>7cTC?SQglGs!k&%mWTC!~UDQ@i?~&gLAaqny zaJ#kGVRfGpi>Pzzt=#?Pu-dNY#$3g-_HLZx##qQFqM7OgSRfFc+38ou`wgrIbM;KP z4zZjcPct?i9cbL%n4Wjib2+E43^T!D1{mRRI$y^XYTvv9-aYE-=`k~JVjAN&D?)-- zsSGg5bW+iuBpqiSxw?fdZoC=Df|gX$+)B_4!xnrnk_{TQ5yJII#&D*5FU^4VZtf<)&Y=Ww!6G&q_thN9;- z8=?@tBWTW)M|!ToffMhmoMJs9JZk8AC9xm$#{K;v4;>waQjWS{<=hFsA#_LOU>gn2 z?N;`-YXv2W;}P`qbWYo-Fufi9xrUQwN;h{yFWscofmBVF5!e$Aq>Cwi3Gs;liUkUF zsC**0^zXQ^aQxJxy<^#WX*|)_JD1!7DKrYD#{FP{zau8%!i+MhmLdox{52pw6UTUj zBW~kBGZb)B(#6AL1(!1*tFOAdW@~kUbe$m^uSGxnOtuYVtgNmkJ7;7&$2q_Gh}l!k zEh;Lit{%9-fn%a=HN~C{tmG`EQT;?@1%TP~+fK^%S1$$X%?Oq^G}se;$JW-Da|?6f z3yAykCq-b_DMm`x0B|=PcI#*6gKuYaYAg9xoxy#u>4NJ>Z&>9NxYn+ED^q*RcdR78SS!aMnw`Cb0Re?~>|++Lxq*dcQdWjb z>R*hBYp?j!Lp^rPb_&#j0x9{#fWCX_FSkyryF=XimdI|!6?hOmPL7O>)YxMAg2_El ze6XxdXxUPd9Z%!VVFf!yc6h}IP#sEZ#isQ|e_;j@Grk9kIn3FHivEUQ3Z@jcxv!*~ zdmw!WiL;aAz=unNm19Z${V{^f*^!mu?1VO$h@3y;V4_6w{k0?jeH)`}Z50C(f&)jQ>CJ+D z&={uIdxI@gI(Y72IGLAk{&r*;7?GckPpc_zt8JI8udZk}Gcg)g_|#V2n?ygy=r-NE zOxbv^DR4N>kEnCm{=PT7!Xb)F(|cV|sPr6ge#DK{{M^C@W+Qt3T9oS9H?2|fI0OM_ zI~Ba-jO#W6AQ+}O^6i)z3<+QZpZW|yXB{{l=4NEb#9W)hpWeDKw529L^}NF0{ynv^ zYBd?enFm~FLUn|!6@n}VTG_qWZae?ff~sy30N0UbtTLRW19ckzD|}sX5%XzFRu=ph zI?iB4(5Hoi5K|*7K?fAzMG@9yauj&!fF4-uG9H~|X*E}mccC^In5n5L)X(Q{%CTcV za&GaSeIm{!0H4K6k!tB*M2hG%3U(_=TY0|Vy&KE!YB;p_V}OE4DlLAib) z^{Hu~?V!hNA0f^GPIGatRVVp)8iN%;#$jPeTiWsMqfP+ErICv1ZAt14rFC_A%FBht z#lgSooIDS4a%AEu^&r{^$g(b(T=}AxL)(d3ERf{Nyr)JXXrgGO%&5C_Sv3^^ND{Bh zRB-+|D>r7f26ktx07pw?cXzs!%E97V2_Rwoe{Jp?>f{VF8RM!Q$W075hMt<&Z3OZ) zsO*H+MOuh+HA~An@x3}65uwOBeG!ONOO|HK(MubdocyGh)$Aj>@pt*Rbk3~m;kg7S zBt?N|cZj_8bVk3Z8kEuW*5oxS;{Q(+NfG58U?___1HeSi&IGsg)Hy zJ)-&f1@gG{BV?0scP^rhGgNZ%j!nuEh zt|H|-#F{>>UWD18Nk~Wl+-$8F`-{tVf>wH?k&5Ar2@F_{^2WH%REgUt=VxMqy1z$k zS?Q<_+@hxjBAROfgzem)ZV<2jGE}3kygc_`qK7TsF3}oW?sS`N$)YX)vV}bL$D0vtfYj%kg($Z{xl0=f$2Itjn5k1CP(xr z0<|mVJ7Uz9n0k?D>t16^A75x_TW&hQ?Lq1>kb2u8y-JitJZsKalh6z|6(}a|}b~EcKEfr~;>;Y0- zXeH$gWv+sf%L$7)F+*?Oh;eBtD2j@TVxcreLDBYg{HH$MXe!)CL;2-wB&ubDe8Hxfj-8Ec1J&+NxCi01;V8sb)296!-s9}wj4O{u%%`E zKQ3W;_Gat1aKg9v-z*R9NGZ@6U+1xw!v&@Q)c`yje+|wk`I(HRct2*<&Wufa*d?dM ze!^|6-e?PMoK)NLQ03ABoWtL$^Jef)hFxh%$3c&yH)ne+a!ml{!_xe6=-rlwM-hnQ zCf$ooNe0}pq4)^>ECYUies8%*B_%D7PII!XWIpGH<}H0xnr*);I^mpk`j?fRH3C*S zxhmbgdA|(lr7)d#+)O63*z*x?$Jo?THC}6v@4VdAmf5$bo*$+@yeKEP*0Ktg{fN>L z-_y9iQ^ZSgycMLo_r6h0{jdRKzD&%{Vfw)axL?$9v=Sg548AR{m!jl5dd=qi^mmAh%c?V^BsW(lCnP^W$WD|i>M8%vQTi_dcBIz=Kc(|@3pg>= zvAZ1LUcZZnOVTrWz3Rs>W2!& z8!#n#+OsNl8awOG*sQZv%b)fyFDy73zdd!z?qlD{g@wT{$H+D%Z5(&xM>jxI2l0%Twk9q z8ILT^EnK&r&N1uFk<9}eaoj5^*KGarkFwL$jYHs_9kVjIiP$JMxLRNHJuz)!t66vUay@784UWDP>P&))8?iS+utK5b*k$sTyPX{7rB#{vpssn zeD7ME9(T*j%~|6ybI9BN{(eAv`xhR3>EhHbFnw^FP70<+EoNt@MatD**UM5;R?6JC zkQGP;jwS`7&|dqOwD%)xs3~AZ3-ea0RzJ#xVgI7Epxlsolk?Xz<<8kpx*HYksetx2 z$e8vp_?EVEDty%(@Q2_$2K+dFta?=5R)ws|ZL^uljC%AW_^0YM*L#JvbKigp*#36! zQj}qiUNYUkvco(&GFPzq5O$~4?YUms4&$?GAf#6*FwY18F^+M4HNbU7m@<;9S{;1G zb6|jeTOY2mb#v2pa_aaV!8zB@tGz>*(3Bid5qYE(FLJ7FuOqhS%VMAzmbdROeyT{E8a3c-sSnNQZPA0%L6*^ zF9e#HT{{!TWT(zY@y^yqr&Pi{RVKSlDLXae{Z8aPw1B~DbV&2gh(G%$HwTrJ5{HsC#}q}dL3h-i8Yy5AGh8{EHsaX_R#ctgAvV@SLd>BqLgnvYVn39Cr0=V-;4g_nc$83u2zk5@w zSu2QrZnCKnO5^D6=>}SeRi}Q?e^hvmAtYGRE2XkGBCHNMmY|2i%P3ZGyRpTn{(^Da z1}p?{TW?l~AymKJ3EyFi4 z3!-2*m-^XdmuYu2or0*(G$l<$YWo({_#PxZW zQxlkhJ9SKq9HUL)5eJ`|XG?Tu*VQHEPmn8$*!{y{jgPCVt5;;6M}v4*?%dVIKsWD* zX){asuPAlKWPDMP#KJ;6aPahD_VHq+=M<2?*R6gWHMRDjjEL{c6Rk!OKYk3U47W|G1r1QU+QJ2cth@~k zg*b8IB43KP(t@|k62luO(ACvdb<~_h`s#k1Ui9M0TgGdna&iRq`S6lP<&~sF!sXkI zj5)EA=(Xj5o-6tfsr}QC7(wOwhKvk!fmQz-$rvbcB zICUElZ*1%}RSx7BHgt4KH7>XVI0SrEkU+pDYB=YiF1l`U)8YbGfeHuRdul{PwZgq$ zgeGpVV#?SXlGRtk1M3W<(T=)%YI0jm0Vb!^hsD&wWxizSgaUB}$fVE!V~@G4 zx;pPW_FkXjl;(f-yCc(_CN&~=xmdrkp5*A|9EvE9C9mR<5TzR z1u8Y1dsGpCNu3!>{+?|HFHl-p0`*KhmcEdk8Kdgi{oBRTqXI|VQ`uSME740*$+N{W zEZwV)goxGE)xbv{j>eldZcX*%jlhKv8+m`G`LBP9;A{t%$4j1cqBe0%*!nL76v**j zNp2+@gB#^NuiwzKb<#}0!w|QYJGuS zDM}PjS;E}4b@?jmk8< zp6PUZy+0-fW&N@r4A{u#DSmKpD-K0Je4mL`-Nx0R>+8p+pJh@MCTfeSvcRe9JDg*? zSJ1MYxW_lhSE;g zxWrGU9@-r6SGM%qy12S8gNR#GfM#v!c2WO)gms>SOPQIMJR#U6%iCk8igv+_sV}Q1MQlXL*!jOB)vSXj~Wr=!3k10uqE6Fe2R|%RJB)T2P$Y0bgJA2o=hEU07cKh(1XI_HNb5RB;7V{vm~+Iul~77g zTT>HUaOIO$R(YLO{v8jELtR)8%5%br`F4Ez*?f}hi^4LXD)KC~)3me{;w$=#(jykk zMIhYrkXt)BUvwt)kb_D3J%tbQoADhFqqW~lFQq0}LaO=_GaNsL7?piQY$ORQOxv%4 z5XawQZfM+#)}ek^&NM-JXHB!Fx@xhzyL!^^Ku74zMG*0x4ZVkD&>@F7Qt|#|0J)eU zZCc?lHPUqiNjasGJWV-dTc zRFPhaOaQ(Jkaa@($paHzLq$>d0Qx+Czyvv_>}oc1Zs=@_bn^Yx!EnL-arF%qkVt-2 z^j`c#P-0Bx2rvN?bup?5oIFR~hfIYR7s7!oMuFf@Pwje`e!i$|0;qL1Ct0=6x@H5D zB5YzEZ>-t^ zkUh7#-%rTS`YQLZty$bJ;8mR!n3y}uj%oCE)=k`B5F~u&7g%Qrv62SBkG33v_~10v zIPd2RYKYYoOFIK=#?WvOLB*h{FXiRi{?D}}6Gbs-MZ!H-P$CY4DOFRyl*a_ zLhN6HB?M_@g;ZCMkx-j`vU=3rW9?0m90P!d4@%7WIN0IS@DFh4gFNmZg%9(zQl1OIcA8ptrz!o)p2YR{TuJ>4uj+=XY|EbPFR4O< z=|6Dcjr;4(C1Z2e`qA5;0L;GubbLqBN&2q=XmR7>6d8k>k+s=w;dq1y2HJGiqC5To zmIa4-us7w>e0xKpo@S6jh|wxwg{578qd}@PoTCef5}@jV_8J7sx`xOxL% z`p$^L!v%NO^%Y@ob0828amn9a-bZY978+tcc7jyuBJHkqX?Ks&p&&?<>if3M}c>whqIX{2(F{iK!`S-l6(+I_>h0t4?D(t8&kys|>P|E(nK&7urHT=hha9N_~#48Ce!u>9;euOQ?+u|vh`t;ZZDK5E5HvHJq(MB{- zic2=Uk0igQwhjxnR>5sq+=r!0{fBe8MMO@0{!3Et6iwZ(rTs2>A`Wy&@(OZDzukZ( zo0p7l-5Y9!7latA>b29q*E7X=j6q7dk5BE@5?~95{S@O?$P5`SW zBfYmA5}mFcAjwGuAnNHUsUtoIQW4FrWp`ns&90&(XvU9sPp zuir>vZodG6MlWBat@5^|VAV60(mN@(ZK_bI*C*ZYqNb!{j&YTjfS@y=#^NwyXRf@c zc20{!Ww-fV5*4WSjxvis$NI^Qdrak}Lm(|AjW3a?dz@S1gQy1IvUf2y@bi+jzw;y5 zL!ZValVJNvRxa7#_F?%0iMnm^W#=7nx#VvT07#Y9-Epu@d*%^(Qe6h+w5M`mseHv> z{Jy*ecfM2Id?@xA&m(Piz-u}`$6c9z1m)2pw3XGJIX}Rj6!Yj<|L2WK*Rr;tzaX?0 z-y9@d$IxN^^|9mJ6$weCd$6B)Vm1t11S!ZwiFAls<9-z@;08ys)rO` z-d`lVd%y8)z&I#z(MYuDoOHnu%B{dzW+hNHTqa+f0PHKR*NXC{abwD;2tG@aXBp*~A{;FA1%a1qVJ8EAamzlXb zQr2(AbxAJ2mYS7-SIYnX1O8!KeC}hv8t+QoRO;5dg(yQ1ds%JfrTqYh0K8DCtW%SV zj<)a8oN*o_EqaRxJSt$5dLFlYNqsWWH&t#1NO;09J2UCwg1FI3lmN@$DxGHogtto0 zgf<`PhzJm@BREC1dz`f|vzQh4V&~H4YtBxV-^H%Ne#MDNz@bq$>Q}XMa&(cehRVX# z8J)+ivqX5*hi(#@H68nJ_c$2!kK10}?JME;B3VOQ$1}*2gZ9PfO&5Ml-HVqWq)6Q6 z?I%@!%~xKFyER~s@mq=KT5=)V%FN#&ZXe}E;w=eQg4NXBS0`B1I8ocJy@Giy%}zH3 z@;3n?9^iD3UO>{TpT~!5ulXUSI$ZN4I9P5IngumS<~MJ|G?>-u2qhn<&f|)~mEBbR z^q80q8S(qj3U0NyjP0X}D=Z&*RKca=eP{O0wDdoDU_&4fJOz1aH3;N}I|PFM_U1Kk z=fg^`AO!NOL_zwIhI=A%3e%g|?D*@JTj$T+YiQTf4p>I_kk4+BJS|2`zZROF&Q#en zCEPWJ!@ytsrh%28jX5|#z6kBw^}(2RGxPJ5&#$Sl2XRdWj(ipz@7I;7!;(BwJf@d! zp?doN=Q>n`K}URl*j|mwkF$~PZ2@y>dNC~;7$X$NHs)H0Bn;ZZW!0oX)!TjVXsieO zZB!Tz*)gkPl^-r@9#D#FcoL!~>PQKf>OrS?kD;im;P_*YHv$O6^_& z+&9nA!Q1}Q**_1kA>nb<+{GEV6Fokei#Gw zK}d)Mx~jOTOwX%)8(e$+=2 z492V1RmFMkImVOxE=OikcxqXNvUSB5;?VQ9M7a`QD{ta``^SA!Ij1F$WqKF6$LhPI z9ji)Dg!)!8dd=&Gzbp$WV!Xm?cB@*8gd~vRR$bNthx&WmmM9WN9(Fzfo{UtdnbU{{ zk`ZH-j8XA?JXE*Ba;a#!w6pS=x=Z+OQ|>MYz0|Qq9Bf5!HR9GMu3WdtTsz@3D_ic4 z+=B`HtQLs1_TlbHb|2Q80uYGm#k+F>BPu6FKxS_hGo9Lk6s?EkMI$N-3UlS_jIZA9G0Q& z`BY=yu^ro!V3wKnIRvln@vGv#z&m+)%9<{hS~{%t?gR9jw*vjodSoCQx;7R!gB;2@`QxOr<0&HMS8Q@pX`;K>_vzu82j`k^qe6NeSb|0Z1yV=pTX8Yi|nEi!wdE+KRDtI$7={mb?CWA)}7mv zPPF34>{#>)T1_tj{ zmmPcj!si}N7oRv1hV>9qnn)%&m>zzx0DGPL-ZekX&wH@T0r>U17?ZT&+>Q}BPtogW6)jTISB)=5A(0ce zapm+lmfoek!QM{rJMSTQEm15}CX&-q(zO@|^YF>2)91)(nROHzQTBN(KpbnQr?jI8 zf$UQ%jBnd95zN{n*WMWUoOao_6yg*5Pcdvxw?L5Ep*HP7Tmge6J}hKn6^(%=z3r6A zNlg}(vZ1;|&Mp0YLSHUM6*(;Qqnf;3j5U?Q**?3{q{mhAH$72N>gedU8mQFG?>$rF zcFcWz10vxQQ+bXqOl5Ji-2y`Nk&jvuhxLB%vXcqF$hpq%ko!Z8tE2PqS*AL@PQuYaHkndhpIH#fZhrFH|h4mRc>9I@>9{oT7N4^{G6&KKqBiHHvaF3)1Bf_--oX zh#a}9^trhnGqXhxN4I-q&mC?QwIwAa$0O2HUlrXQERDDIk+Cg?K#Em*S8*+FQ)1rC zrF@bEfxVI9+x2I8D|Q|*hdv?0>6>oe3a@yhB3$a!w$In--;!s*k4!`-+jV#8OECN= z?C~}MDW;{5NRbwN_H{;57CnmBbS%p37N--hH@ z9SutfBc4z;**4z^1jfR5=6hAWZR?st+y`xEtC_|4r!B{OtBoa@nVI$82Z|!&J)BNF zgYo>!-^Xd5(}IfzEXMZd|s{fBlD>*KIf@3xkrB0c?2aS7D8ff-w) z%d=7(v<}JHYk@LrEz$4THjh;rE04^w$48hnJf}9ULrW0`FLlhGR#&?kGmK#l#qEzso#g z1Wox*Nv5J%+@yl1-Ov=ZdQxNCq8L|njto;t@mzT$&ugXqt~}l_+3V=tj`#W3&I;@K ztxxdWAGVqNmyQo`p~}iiacXyaHb>iROdg?}9|*)RTmrpcg1MBQviauYw*9=*vyMIX zsj{NFofQw9*zBB7J)G#@RA&sP3Ta%Pwz$s(H{T|bnmZN=WAwy}#PIzGEbpCfMQz5;uL<(&me#0NXQS2_I8oY+tUHo^h! zaFA?Cf+5DjZT!N@1VaPY`7)fi0*jx}F4~)|&aeJ_jgdLgyo#f&lB}Zzmo-~KpAi7t%06B}UGzDgq6uA{Ue4?G z2jTO_yUSV{di6C0PsYO+L&~v(z=@;Cv5tys6usO-=x`Z zZs>2s+iM;zf9az{g^Tqy@u$GTBIQ&heofF11F~%;}Du@6GE0z>qzpj;PLFR}Peq z>{@UZ1m4Pcp2|v)`Ee-E@#H7G zNIz1K7puFR6K)qv%VoH;Z1;pYTU3finvdO3LWtT{4b9ra zLz(z8UJS*T;spk!sRJAb81ohw2MT~8pV)BER_Q4X8w#1(w|A%sni?Hlj16pE>Bz5a zgTCW8qZTggu%E$qZ|O|$)x9;>B?eOA?J zMEwGTy<2BaUv%Ddo5VPBW>@k05) zfz%Tf22ZOi;n}j$JrvQxDzCUq@Phu*`Gran21~GM5&H0SGkt%wzFm zw>A%}G<<-paO%%q(fO>(leOtDC!@wpUX#gi3cnouS49?|FBZCWQv6O#G+mT->a&$| z)Dh+S9M6V$tGX5(g&6a)1lTjY=P6J&K8if^x&a=H&OgZiJw~b+qrAvW0b!nkr-abP z*UlAzLZ!&QODoU*FDpOj{HovoT-(6WcP)SvptFxyO8G<&XCNVPdzHA$s(728%*2m_ z_1;f`K4z3p*Szs34nP5xWmC#CMuqm$e(%+^Byu&I zoyzMIdOTLonhd7+V?TWO5I2$bR-bL?*h2H2^OAWc->aXcnsL5)I!aZI4B7+`2=XqT zdG)jr|8)yJ(8VFG%!A!jxb^Yj4!;sjUHXd=;RBJapP`!hJB~a+m3e6>MZMb>?gm-a zHkzLuTd=Vx*6q=#O`LN79X_uw#(k%NKyrn{jU}eZD{oocM72Ag5Ma};wbRv7JM3-W zwit1zNsP+@1riIYP)$wrG}WR@kTClPNSFbqwCa`b=a}f}a-BzY26EZvifZ2Cl3setwy8})aQ~Y+M=m>2F z*!ouNk>)#!U<3aHABvaA^)E)IQ;CVA2ru2g4_rN*CmI~y@Z3wc@?M`|Iq%)pFP62& z>WPVV}Z%2>EU97@x78BW;=kM)a_I!E>%mi;o zhpSLxeBmay{J$JZDrL>BexQZ^(v3$^lfvN%cO*pVGSK9WLLBss`J3K%H1`+Llx{7o zg>qLsjGGelnEkmJ_dtnK>1Ps#GTrjE-PQ)Fc^9rJFs z)q1zNY}r8$TwvBiKpATBVvY+!WKDltWnX4#hVwvaaY$ISyMq?ykD-<%S7WS~sNI zzXGuVLjoUz+vjnkU=nUM^|GO%o#*AYHLn8YLlik65^vhhTwMkGQ&F4PHzPMZ1FG%#AAKyJp zd@3L&;5R$?Uc-%xIKp}hgw2MQ{7p7bpOsH9?dUXcx|J}(petIWQm)UfV!Dy+J)A=* z*t3XY-u)yfNGd^nw;wW`{}z`4c~60;l#MsV(_$&!avq^1XtMV^E@wtyYn?c9b+T=!@k?nutB?ARF(!+Vt{vq%e)I$--)L{baWhGgWw-ECH?K(Yv(xLNd}X z1ab`9w!BT{`TXtXf$hVS-R}c>eRhNgfqeHvxIQR(Q{7F)C$xb4shW{9m8y(4q`920gBRn zyJZ1U75ERgbT_OoIez;!O{Du|p*{44KvTWVEs)#Z+RdwLsXs>mO$jEa54Nnx>?{lv2!)Bzj|C6%$k z)6$}`({0JJqXmkxqpY#x!6&aqADo=P({HvEhe}h#ld5#RicUgUxpj(yMj^RmljPS` zbD%uX^uUkAFL!GmP|{qmZGQ(Gh6~bREr=>tMZ zx9qtQ%IlDS0)%;#3HceX#Iem-KcB#w%=_@}McB}^Zi(y8oihR#L48Iu646@MYOiL^ zqQC9?ug=;~#5buA7RG}6s z{MKs>$Vt>?JPN(SlE{BxiDH}UNTa_#{r1-xuloJowuH{dd{b;ceyJ`jKFrgx+;~r1 zmEK-!OKQ>oqP9YWg$LDSNJQRk2{nc0x}#D6H1FdcMy@{HJGpH=k=;{w5Q6YauKQj< zcwd@}cw?e&B7C0Xqgm^knpb(3aIuqb@F^0>8%fAOgZM%dcby!x=AZc}747SJDoYT} zQ?(DHI0zeeGi1E>jQjk+(#*izgPfLI_;QmR!N%_romFDGiKWO(s%a3&!)tPw;A?qq z5a5}{l$+S;@Z&0R2Mju3YV`QpdnEIoz%LTYUyQI+O^_hEKi_hgDi)81N}{NKiBc45 zU)+#G-V7ks8cZDDLD&dp?u~ndA?oy3V~=iSa)GxX9gz~~{%18)ugGRpGB%1t->l6^AoT)JgO`90qy^Z7YmA<3Ni=md}M>RF@ zSPqHO9@*kN!lZk6H2{jBAY#K&`avrH-x8=*mmvjd1{XiaS2phiAy^=OjQWl0vR|IB z`LKB(+zSCT0q8MG@8*Nk5wWy)=uw0K#6~x(g@DnHSr)5rr<;Tf^MFZjEB+X}jdEvx zeXr>&;(={oV_DFFcfo}fHhMZU=WgW>gL=p+OwzU}MH4mrV%V*n8Y z6;Y1sK1M)T8bSn>Bu1Sc_3V~#oa`>JrR`U~VBU%O!_AsM{8ddO#^_v(b z1u-`TWSBPKF2w&wgp)A?(yx@#Ur1IK)tf5kJ8tMr{OhW1pk2J1FBKpV7`hW95uV)j zTt%>gKnBl3gwe6Wq|k@)uAy=nU(dh2+WFr0;Myt#Fu}(3gap7fo`WV`kus?$gn&SX z?_9nMg0SAdcQ*(`;J>)?2*G2CGy49^_aLi)(zyKV(g5JyDq}+Z8ovEsKfio27ex|c zgmPczRaVje{(QJrml(X@k72o~#uzSSNB~iIeYv3iJ`c_ugTok(A-vw;(;&q;4SWd1 zbtyEB#xSB9y&nPu3|tiS_rGbqd57L_|1WWfydJ`76ZwxD^>4#3Z$#~)){4Rmtd7Mn zjJdH`lmY)zZ$K-&A_~+mMrSKkfvizntzS?keIR+IO!fcVNJ|U4x^d0XrwHQjQ}95~ z5h%i_LOAln%xEQbNd&GvQV9lC+5DZy^I5sb=65P_%_yd8CT^8s?Dk$Zov1X7H1)dN-p zGrBOI{JpD@O3QwDt&a%>dnYmfl@Z8PM{sQgHVwFQ(P%%x0z9Qktjj+{E-V1O%MqwKxv_F{$HAL z`3xo6mw!kk0sY{8yjzR)766QZ3jLQCQ+=Oupe&|^>hQ6_WiNQheg6^_1iC~3 zaN59?YU@N$Kk_M^ak)KAfN$Pv3T3XlWYiuAYg2+OML)y;|*OS;PCXv2z!rGYGRiAI3Mjzv7Xl;#c){W=k(GOjDl7W0O<-w;X+z3bP#z1GV6nEAi4MBgi5?DA4%GwX61Kqq@ifufZ(2YSAiP5V(G`%Yf5SM`%W7}( zZ2M8cGTUEW{cCluELceOC*IPlrLZy}jT0;ZVqP$! zA^&qZ!{q{&aG?Jq6#lY|#+ZP7dT~jZgPEk3D14>&xmHNz-yr?B5E}h0gy0QcWi0M` zm8cQ0pMTkr-!F!(`(8=nUP`j6-}~!=4L?r+Ci)+1bCO-x3xwd2-T|UHTaE(&z|jgF zAtZq=cPTIaXQbEYI)SwT(+X+k!j-zIKqRze2!zGXic@-(zwY%KW$G<@5Om*!5h@46 z+tu`Lmk#xpAHzEUv#eS*l1Y@tLgIfGib~(&wsgPf$1QQzujxPQ^P93+EMU_%kQR7b zc-t0?d#?-sHqx@#Xfydn>T9s9!#p~%Pn3`2>SXq|zm=d+0btuAe{SnUyJxT8c{xlHR9PLKMQ`Jw0JFz7?) za7&a)hQQD+bH=5=cQA#j?7S8j$&y8XeeYb2=aZrIPJ8w!Ip5OuXTzo|`HsyaCF!S= z@t+YARw$(N{|;b1_hpcArn^X*yhqk#C|OFnMiW%Dmx%mhtqm0GJ+4*rW&d<%d0ba z3l+Y^XM3o{>zzwhJyofUp$eMIl7wD%4zw>3lkuTi^Wn{8NX*@?C>p@Nmx|uOBP!~ z4=3Lx4+88c4r(PkVDDNh_}LvrZI`@KeD{#U0`n!+ZR^-F4EQ-hR)dYuI9#(%#i7$@*4pXyT_{8(OHsCbpLi9%(hLL>%xdsb9w>(5e3*$f}fZXDsn zWoNqw(q9Alkm;!+YSDV7d{WdVYiM1p(*C3H_@?$j3MXL5r^;d}0?tN(tA}+)qgJdJ;^- zKTp2ejd^92UOG28_ap<=SQH9^v80Gfo^=!cs6khu5jU5H5>dO&i{iww^;yH_3EsYl zckTTe!&zg5N^#E3JvQVTS+h+^+1lw0$go>^xO0HZ=hnw6O>tsxjcSos8EnFJ1_kp^ zsr99`PHnD;h&v8e7a4}0^GS&5^Zpf8^@e0vX(&jrPx;J`_;@<&Hdzh@!PKPQY4r?J zZ6ua(mS5_Tsn)yqttjRKz{)g0C!&aSmTyK}g_cVxKF1(4E%y1rPV`HI=Z&RYJa^fN z@j(WukDBLHL?3}DnE8eC)`>^2$0^}_sRf@*WcoaZaU~-0lkv@~>_RRX%44W(S-~k~ z>w;-$8H{CE=d^9sjjX#)U3_R2-LaULYr2dM;Y zK_Z9R#Jj!1CzCwNc-N)!!+xGfZ3T#E4^0+$&8%}Rjs?WOORwg;D$_!~1Y>-AugiR? zOM-5=NF@?WTb}}7uCVcF8YMVc?j|MGw##oYcAK_gI1|Lb0ZYS~4|k}WJQK?5<*;$- z?h$P~<&)Z8{#V*i9B3&~5>%m-?dbHiGBv0J%1LtX&b)6Y#=9j0QZRefik+-NE*3uP z%YaaFn5QL66e~GR$jfUbG&lT(d{b!*8mBM3Lcl#D0g~T3QJL99ZKxZMVEjMPFZHP3Dof z?M7wXWrfp}31Px7K?w85BIsSp_vN}P2wClsEL>s zt)1kXg-=fj7tNGgs_T4?lAa*FqwKaZN;Zz*ZyM%(0j%jTXHe;1(Ub)2DG4JnwoH1- z8b_1+?jQP1zx_QP&W2kd(qLPdi5?^v;tL;uAs(H6`)G~0akr$N&2DG%9;m+hhZYw{ z0x^U|vULT~Uwgz8I2&?uuJZH)<%Z{S)eZANd1Id@yCPe}``TRfI(}9}0ee0iMsnmI zVF|!SZ`Zz!bIG*R0Ayjo&{%;(Ooxws>C-59NX9_Ru)jO*QgUuiXGHNb1#{o6Jp#l}Pnm8f+DRS~Jl zTm?$ZRQRbJsEzr=)&*!a)#cPiQNZ%g+t$0y!WKM~oK9b>K0)-}ao=WKA|Qp8H&$17 z(kk!OPAt7VtuOucN!QDpPe6U!q88eH0csXJzy9L?%k!5%2lXFQr=>j=CP69V7rAlM z-kTLw;?6?D8bvRibUY#psW)mI^ipW1e%i52KU1^1Il#i%v(Q0v^dxvdr6Nv4YU_uI z!{zqi1Xb@vNI`~0f!`@5DEz#KQ_4X}_yUP`Hz@I_LwiP)+p@FtW1x~_X>)Wg9G(%B z#N&CWs&u8@K|JbH`p;kb)f6Ayh;;r`!P^r}&4YWHf?i$Ii12Lg#oWgN4WrZRPH}d1 z!a>e#_pqU=TCX=a<@5GW%#{34hAu}y4oywj_>O_1g@t?^MHUw5*g%ELkLJ06rz)sgLEY713>mUyA*?a}fYPd`}85zv|dvi;axgvL#`hg1KuV5V1e z{(}UU#@(lz0gfH6`<2vJ2mXbDPm*e>Z)_SumZEs!<6si54 zVzfbG5X4KorZ7`;Mhy)uHygy_V!m9KyC{M9&fxBWxJxdO+bbh6Df-RISEv5pwR}Q+ z-&|3F$PpWb9ix5k_=-(l{{|k6#UU9(X!={pGGd@l7~i0^)1 zt}2)=bXoa#)cT*QesPrBazmy3!csx#ve8Y@sN!oVs!?K7KHCP1X7&BAzz?F4Ddozvyg_*W@9rf+4H=@U`p7~b@m}mRUQ1tOrF#P>+?mwhfY72 zX3kYL^@l`?EFUFzk#*M|G<*oO7QMJr!!ebA=hoPBTsb_5zi7r915MoAR)b)OBKI%eX|$>WpB#qtk@Vl%#F*IOTO&JYmFw-7!R^QNA>YtdtUk_ocP4C-l8^xx zpO?LLLTqMh=W*LWmARNu{h#F))?I9rWBI3TsDwV?TPn0GR7Y|wioEq6*9pYZ{5)i1 z&l8IP%_|si`QpWP)hNhY?cazWU>8r`TK^z0quWrqTz=jrm=y6B=owGu+xhLTZQ}3@ z4#qENl8~$I#-Sm}o7HtG%KAklAMk>$yP}Al@nG!Ut7>ipX<4$o@6p8Y`^tMA!H@va=Sg z4pa=8987Z`eOw_BIhq_*?A@Hm_Y$PS3Tg&saAgwIy9&&th`RYc@(t_WEk_s1WM^^J z->C<3+A#V$xA{^H+#QO1O(GC_b#0&8J z{z*@X9}R;R~oeeYbAxb9$(l-rz-35aW4rhcDCEp6W@+wkEu zn|cy3UuQrr#)5F) zY|x)gF+TgoKcIGdfv@V+y8GSE@!rNFK@e_>;9B`P^?1eka+qD*7dD$|UV*#pUksU+ zkbGYvYWU7x;~*04jVfqj@$?x0;`D#&D76VDzsU;~)YNP@gPh-6q(;NjqQ;`|0Le-v;*i<#{1l(H$P$(XqWyS}n*^wbDN z?0_*UUHszFeEN@saK5M8X1(uFwvw4yZB%W!vSD@JUT%(%s8~Z58_q+|Zw3-xvXH<$@E#AlLUMb#8EfTrGuK|jkdw9MwV%#w@Rw116> z^l|M>h*XYGUjqj*3gKG-0$h=;O9Vm{e&Kyh#zWZ>%+rlBRy+4}Op@1JJ7QinKOLJN zcGTs=BZPl?UmOOhR@E)L2qigpcd8p?e`vHeusYsDR1gJ+|LDeHiUezQ2 zGgyZQ4B4$8?WLD%#1*ccSnH!Ejzm%Wr}{9cg5=+b)S~k6Jomm`p9HFkJ zHIQK)T*vf&Z75^nSSbNiDN#t4ze=X)-|;p0tgLpq*I!YQk#c}CzbdddxIg&T0lwhU zIxglI`W!50-tW>TH8;-$CTFC8(4!X=y7K9RLlRO-TptoPI=Z&M^G#u^g8@Mt?zW;!04k%dV#bqAzX6MMhZ`}#gt(Xlhi+`NSw2#N4MOqU_syk~uK5uh9yl>OZzePFT3Ryntvfs|0|6fwl|xP9-5`7b>!?aQXxBWX6;889K&hEc6aO={ajZQl7!0}j!TUtiLw?* zs3$5LeUXf_@`8letlW=Oz_+Qdf6dXzbA%8|jiQ&b0c%I~Pu-i~6<{L7Zk>0C>uMdo zWJBnI?J^SQYeM!H_Vj2+KHl=A@m)XDXS3NmIaD(>K5O>8&u6SrN$k{K)Xc@B&BnNZ;;&9+>||Wjj;%Y2 z30ZcgXXQ_F#3|2TcAtiF>UcvE7w8lgpM=^AvM6r9b;!UMU-qxTA@gD$LUqndhblmq zXJ{kb2Z&hWt~bQX8uuuN97Xr_M*(3`wFAc(^aUs$?_LMD{KG*qfAGaykS>JKZGp#^ z7b*+WpGrjD4sv#Yu5ALrS1zZt4EWn0164SlNS=w>bb0yznh2n~uZo4rt4KJ4@m^ji zvYrm>>DAqIkQDi!yIW5$>1v6=e|vX~H|iRm?3*!EGmwdY`{0|y#AUjP8|6n_m%fX7 z19}sAz)pQ3R)iBBqAWlMdruH}N<-IXpFt@ir87WPG}rf(7Ch-o`WT7|nSBPG zMMu`|x7$_vIt4;m2~@mS;yiG`QJZw;T4iSxZb)o{&W35FEaJ17J9ToB`g6RNN=vuh zMb5X&36hhxvy;YCS3KVci%6rS+y7O&?vDi+bZjQ~4C(<^Wi{BCoFivwZSU|+T0rcP ziJSq~pWpLy@!7dR&R93yf91`Padvfd^1e;Gkg0x6FN_-cuJc+7pG0v}iJayH(QUxZ z`c^0Q26k!np7=NnO(InVsfH>5|Fkfd_U5hea!^|PHtUesr~UIBSX4btQ8r)w<$;4# zhnRv${lI1O^Cp3jHD{qfLggGDMn)MZs2%uvZZ5}+PSSdDb`-3@*|fLO#zU;|7*%Ek zDsI=D5#idXnBm8!Hp#+Hk)QW*AR?|%FDZ6)1n;&S$V>q2B3_%%lBCYVrvG6meqK3Y zdt1_bcR(&l*o{AU&9M}JG{&XjwJBL-Tjx)9ovK}g<)+_u_wY)WRza`43SM9feh#=jc^h+q#yR^b=5tN!pZbo|sRp7#ZF5@^T*F0f z0!0Vuk&TD0W1-Cj-S6Xae7IgtH{)Os$ZvTvMCTq=e)w?XMSDA{OSV$NctT9<0lj5> zeIdR0ot{MGy|G{#&t-=;YNjqnwH%(90mv{AxAbUxj{#UXtFM>&Y655dzAZ1&R<*t+ z-#IvaWAJc0U`R!XpDJXzw(-SYd>w7Fpxrm3$O-l?29JyciM#Y2gDEWXKzvUljT!lz z$(oJtLF9u!k>Sc%hb4dBeP6f+gQ6UYIAj%pzJRx87Gofe@8Rr;7mbhYx48u+r_$4J zs(M4cVrSn0D_@kVxuZIYDPs(U-9KCL|zF&|=0aY8NsEXejWF90aoS5nxBC4=0% z`JTskF!~iA=d3)~hC+(4TOm}T!&f&N)Lzlc!+sZW%#CtLiikI0+XEU-J_ss*`sN5W_O?rbRW35>Ww?VQ9K>M7S z(oM^~t2F=qt)6}0(Q?CH+7f|&qhpQc4Y3+K4FGyX0Y_RdWH?v_igfCB5qU+8`$$$h zPW=+NrLq<%CH!Gx5=1~PYV+=+EF-@yiw7_)AVdh{!VPYTMs6vmzJB`USZ;ok#&3dA zYj&9+rqLeEGS?)Y&m=vE@PV}|$LADsQCz=vyL09vhXHgbF00Lb1+~=Ldh_}1G4USm z1Vi8Lk8E$@@YkxjZU-E0O4V>c6)k+!w9VNmD{Azc-E(W6eK)cGI4JjJKoO0q95ny! z(aziJ4Fe#n76jegII%9ZHdU3GJ=ozq8sJ&rZW7BsAI?Pz6kt!99S*$t}C#* z?|7S?{vP&S)BuVo0Q7}Cryu09Vo_{otJ;XUXzG+ZFHjSRRTyoRCKfzt;cD;4SPh=)E3L|`8X}2ICNY`p8$NLixHc(ilG_i3;N3NS1I<@A9eVFD zk(JwsE%Y4Vwy2tdh>Mo^72Ag2?k$?gHrkuHp=vX_5MJ(hLJngpvzs!@rDEk)xfgUz zxrB3G^bC6qAo)o*KtAC!rg{x;(ijc)qJxL z=yZ*isqyf5kR+d|;K&S=BNTIvMK}1}bciCfT%=Ou>9mh0YzP!|Oh8#YUT0vapw_-M zwqtg74Hq4maXFm2B|>*a`G_L~6IabzdZ}Fo2>rO2yBxO`2VdqWd#$zffm&JQjJU?y zybyh&JdIuhHokYJ$4^Te5wsS6kXDghf#lHdb&?ub8O?;WHy>!c)0_|i!%a;C zq$L!b`LKYh8I+sOhtAwnO4@H;+myX~t7u|<2UEDxPI!L~2P4_phK_2#T0hVlF>}`c zy{3tCzj_MB22Kef2}%k1B)u7=YX}*CGKt+&0`~C-aP6ZqNf_`9H7ylp18DsYXQ$he zPhQQ!h$DrG@!Kj6Q_+|V9JV~zcM@($8Pk79S+>JLN_e`vXmWM-$iXT)UXuQg`#tc= zg6ApnPvXH)!$JCzZiQ94Q1|=<)C`LQcOI0Zdx|nHkR**))tC<#Cr=4!o}AiNS&xN| zM5_1#>3<9(3#jHdQ=spyypv2yK$ z-j5?bT*8%n7Mx?2 zrRDMQ^u4x=`TqF`!DpHyfCdAn2bI^y>yP(?FDr4C&Q8}h{Ys_PKpYxIQ%BMLahUVg>G+(lA^ zTLaJEaC5_;Xlecq4~WvcJLMCO7f&vds{RCgL$9Y%5hOCcJWu5hjsZnM6`m50Fl<^h zR_&6x){G{JI3C2knVRf7v5|AgTzw7B?@`>>sdMisJ?d)|IrGRr%4%DOgZOWwe?K&= zkGB8flRR%W^LFQm^~QPMP!p#?Y|O_RPF88ygUj%g!z*QguB)_gZJf4lVQl7fNdG6b zm^REze+bV6(E~&VZ{jxN_H4bJM)aw)Wo6h zeK`L+Ahsu`{>VUt=Ae4AsBv%hIJ^~{v5FKYR3*t0`-zG)CGHaN%EO8`{3zYMAZrg6-{7@ySZH_o#&W&Q zwoWtp<5y(WSP&f_Yui|xCY)5b3V-~g)JrbbEE2(rwbNuTNEO*Ct?yK$ho94Ru8D<# z?$YQDPStg#7IFX1k0-*n9o6tWjmE4K-MC`Jrui-zvBQbxEX(`TeNE@a3#%?UiT2K% z`PA9PEMmo8ml17_#2e9T(WV}gE&>EizqgT-dO1URtrbRGTwXs9+@?LxIu{hpbokj0 z#6`Bgt79Hp!OdiD1-+BKo2FV^Zn{%j5!lpsvNusAW@uRc(;%Cgvsk?5Vm5>+QAA>B zuIcQ!>(34bMXhc2uY@~<!Qq{WllO)U5*#O#5RXr|7V3;)repnkr?EGN z#102%ojoU~DT^9TTMlwqL$`BIKQx$guEN)BX^~vitIeiB+GntB+r7~DScUxvwvHCA)J}G$ zxv7~#X@QNBQxr5$sSaO`#%J=Vg@c`S>~y@VPuzJX>A6VbI^nQyENNs;cGlQTw3*IO z`8g9owfE#+no+UYqqSBXKfmQhVQ^ex?+fBfYXK7b?f#}g>;RmI%fu-tg4*s1T2 zr)ac%Ifthqkv1wmqDT_0v&>@-H6}k(d3ZLbSj0T0XP(_wH#MU9QIeb^uFiR9vGUc# zjQ2@X))#bKrLZ=W5_dL0MGG+U@$s>7tJIlX4e|%6Fm+A4A`SxBCKAkV z2c8MXgXu|H?@XO9dL2*STehb%&2ck4#mhtA=xM%rE{%8FFWgDbW0(OF|ga|t6}dc|<;6_S%swXa>pf4v>#w7VoKczVEx*M1bBoVo7QAS@ z8Jf%<0m+m#{~3-jD0kipNXj{$xNCfZHvK_Ef2eu3e}92xov*wpBNyJa!i{^E7<*jh zbm)zX{?MLyeYyZ6Bl*pr)0JO*>eHDy;=I<<=O#F}#e%3%<{n0A=v0eQQka zI@)Spl&o(`PlRRHR4EK(x?g@>j32kmHHfXtz%G>jy{dg%Lemb(^#0a9JV=thY&D03 zsnn2qPoIA9kLJgqQ%!omkyRH;Si0OP7y#VF-E1+pZ6XvGH6Xd+1bSV`sLSCS=dy)a;^Z|p3I9dw%r%xrCThGJK> z4Z%~xsV$1-1o4A20Q|6WDi!K~Xj>EY8_hyYxz|msk7?*RE{;jP^xbPMN95Sh3P+he zq>0q`9ob__@s!o+Se&dkR}tU;>SfndBK#CX=4o&^mCx#(msK{Jg!qA^-6;YKH93As zJ5KBF)vk>{9tBhR9_uXai~agKnXOb&UFmRE`>^a~gYa3!NWPYh@S|VL^U6rC{epP-j~3Oc@3JmSevIi8HQ-|<%6iro|T>Ed&h zdDj!gsy3eGM4X6qKgYU#>W1kL03EZ!$h?ndy$rpNzs2&E8wlU!Svw8maHvikuy^m= z>7#NOb|8zWF868c4NZ@=ncf|Wnj=Vhq!GNcTh@EWb?Xx; zyY8K!5(l4wDnq~XPQ@5&cz$Kl;EST-p%o#gKOSu<&Q>S*N#HzGetv!|r#|m|S)`b^ zTW#UmzJn#Aao(S&@8Mzp-R9Y-!nGQuc!QljU27}2q3`VHQL$X1kSQhwH4z$C{W>Tq z{*%H2|j!eu!c=2j18Ja~Zgo=AqinC9Aa>o=aatN&73%D}_)auH!D zV!!!HxEud)W)&Qb@0i~c;or*Q!AzMy2rjR__jaJfsY)Fq(W8YgV`|ohkv^DgKgxcVY_wlvV0$J1kmy$?( zqspbjFmCsSYr*|ZyV*Y?S*b1wz2e}mz;bHHvC*5rkNXY}iTm`!JR7i=OiJCjN?(G4thR$>FogmTZX%`Cm;iR7vCis|h~h zf!B7-pZ_=bLiyi&;zYxZP2$r{JI}=kYZnA|xkzq~r(?#g$JEeJuKXp~-ktu3`s(_n za|dXx?NWFN3r=~g??Ma`8Mr+wzo{LhC?O0Ff~u5j~Rm=l>vBd#s$8F-7r5eoc5 z5t!Af+Q8#I15=wM`*C~wGaj!3hI(UIoZ;)8qwYxThlg+Lf!V3HT9;fXJI#d%ShD}sgb;da+ssE7k)}g zQN(mCsw%2?^8C4d2xWJK)_9jC`V1wo0GnsOln9!WHDq^GRIfm${~qec@&o}={IFqk z^G}eSr+V92Z1S3mZQMK7#+p%ve+pbK!~jz{Sw9Y);z((+1FN?u)cLQtuIdJY4wCGAw#1V^JAfhbe8| zMTzfxOL)u|uz0`$Ia(`_-}K-8)J7}cyBj2GRjVkU`XDaX8|Np&dCzv!U$3$0XtxOd z*6__bc&_98;tkjNRgzLksXV+4itA8X6DiQEc=-XBsUCtaVc#kJFka!4P{ zU|pZ;47}iqk#v`{v6K&Haa%+9`o;;a6f;qa@y`BnLPV?#t3C;*uQ1W=h zSBOG+_Cm+f14rw;R#fzREj}@XNpK^I7&;1gn#g|?(e3j~2Zybfb3{4aCziBQn*;?p z##pD_F$b5I(|x-_Y;i#Y#Zn_sMB7j|dhR39c zj0x0Ce@#oP7>Qb$AioXb^ms4V@MCduacOKOMVj6e_6-auZwMek=>Bq5>MwIMqY62G zsp@PLzU(GK2_K$=4^D_p-W$9cj~T|mrAAg)lQV<1sn8@-&)GkErCk19X_-O2oxOL2 zghcEx8}HOJbfFzb+0}ZPskH&C76ll7jW=4*5e_|bAKRlMeV2Cbs*&%_mb8-&Df&PS zm>#YJgre1O4<@PfuPl5qv<;{~J)#O@JmfDX{nKHP`^#2wK38hN*HF);c(uJDdBNy;&G^{6r&S6x#aq7H(W0O-? z_S)K=Qp4ZRBprt=)*1W$efRA4?@FDPQ;c$r`T3KJUO4YD5gc5?ayjoB>RgB~>&U97 zwT-o^u$Zu%0hvokx>agiIjQ|XoPK)o4Rf)v2l3E0 zA<^lIGUW)DIm%KJI9u%qnu!T~h8%RxAPySEXM5>QdvCv6E-HwvT&DJxyD-=5$T#_ij%&%7H)cQs40ZGlRuf zr;~f|jG&7Cv5fEMe)C$@cQs3$Q|eDtCC;B5&Cy|gcb2xX>i>tA`Zmae7`k3k?}?51 z^7yMgQ|N4w@W+20mp&W=GOp4Ow#ga!U)q9;;0zrkg-EDi4lzu=CZ2Chqg# zNxIa3Vtxis6#9GL+?^$FOw~58Y`c$nh#hV3AgopI zda++FJAI1kcKdT&T>fe(cK#U0$mdV*)NlO^T3uhUO|UO@G2WjoH5j0R>*w5y-oL$+8F;W! z*DjEopO;+D{94+RsWqd5my=8|N>EQjSGrZXWjg_BGxm&G! z20Ith0$vO>#qC|XcW*aquj;_Tw`x(oQh4g@>EIurT8Jr;?Xb6l3H_<1@^hV**qY5x ziHU(z=LK4Jr!Zdsyw6{~cC9coV9U$C>sA5AzQZK&$lYeBUh44hbV~lRq`kw&$g47x zmEO+Mq5MPuFtynm`T6}S;Au86)YWbH&SMkU^ct=k-)Ix+B55CIyLZt&-S6n@gX^C% zVu?GbP43!#=?0e&xvMI=;8PXLM6LS|^7f@HJJx%xeXoT0c&A)iim5;(@%50J`IC6> z8up2`Evjm^j^xGX|2o=Ry=(PH!>qL6|3>cZbcnT(y9T2ZipHjPwtjjH$mW@sZp_-L zjP({i*lRla+YQ9Eu;ns4e!}@IhUh2-kar~p6pwp7j<^E8A@AQ2x-&dHyy<_i`c8nm z&i&EQhHy85SU=@bH2Rh4JgxLf?&~iY$$w5}cFae2%-3n9&Kz#4|1$G?H!bR3Fb}Pi zZZ2`m45VyaR_Cg-*Sjt+zYGRc4)1BLmfnm#Qk8*iz)=>EpnMvQ5oU414JIW}p`_z` zWc5na17V{ED~-4%>b(Z9ERtP!hRRpu8qh^XMn*zkk1I0y?X5103rKYa25Hgsv>`{e zSJ9r4Wr;cV#6}wtic+RK!OrF6a)F-K**AiKqzr z^4gK~hjI0LE6zBtnR-b$eCU2x8n4B@^}B3p8pL0t#n{#QC9j6!_YCDa5WmgvAiU2G zy6?hW|4Vk0DN;o>rmy&}%)DsK@(tANbBN&mU^i3&eYjpT^!R6b>|qwON?DQR(wMB^Th; zpy**UU{qr@%RKM$?b~g6$1PuvWeSCoE8r#P-`Zd26F7WT#E2!TcHxai93?Qw!C}(= z)PNEp>W5xNs!vDXe8?rk2|1$AQ24J+Y(YMP z8W#@WKOQ{L{f$pE@wjB?T*1s59@h4-fiF{0Nz!xLY2$ioH3zDf&I4zZigQp;rR}Dp zO>8$Fcwl>-honSUK91jIlJCu4_xriV!rSYHkPGeYbIwL0`7~yqxq(Ywx!lQPsTjvs zY;0_|an)2uL#wZ|Q~cD$g%JUc9dus3!b%bSAu|6%Fo$#kchJHQ&@=;DySYy)Cln~w zM~xwxAp9dq)cp9sqcqL0b*QNxh9n(^?5P{zia=D(iR-+0_sPnV)amn*eNMiw!ZClxq3s`N4a;92F^ow%FYnzVJP6L>Kx@_7ESwHjIzDK6DVY)%x3)9#`-MR? zyZ@qZo7x3li}EiMmd`PuQ5yCVa*R%?p>IZ)$`B1K@Aw~xB^$EF9qJ~c=;>$Q$nB&^ z*^i<$DwnQlC-sQeOktDwJc1?>)jTbWhH;;h6J}7pl{UT^cswVWAKe@}DCPf&){@oi z(k@?PsA$L*RDEc0vCeH_lrvhSXG-azRjTa!Lk+$w<*n?YZL?c`dNsGqDDOJvb*(1K z{^2Pf&&0-D7yQyO-R)cmG=%92+)TwC6;adj`v0|TJY?nlIH$$`7a}JhnlFuto%x%y z2^1rDwO}sxmFfKlLIj-CDY=~@vG+gTPJGdg8)Yp%hR=v~kRbde?TRxZBPRQrfXEHc5hhdet*T`9~^%Wl0^l&WZ`x zELA<@n!=y)?(T?mov&qA_d+h22U3YinL$%E@Gy@7jzHo!At}Jm-z> zg1MdNqBnj@q|`7nuCLweGIdg9+Uqcg*|2Qqo;0g#nZxZbydOUzXdMQ6ddB}gjO$%i zYrQP7|04o|dRa4W6#W$h<<=?g1Ric0m1D5v@3#zqIcC;Pmht}X76Rg9oXGEglEinpO`PHW zLg!0`B{$ho7M9d#X)mUh2Uo`LYjl`H*)NVzWEPAYnhy?utUGo2Y!Qxk zdLWBc60VJe#Np>b4o}uj+h%U>C1oZbQbKu!p6pQc%k6#>NS~7uCUpvn^)4Yg=Jn5f z=p%S#`cuQt)4b6xY(yUg`F1i8SRQ44%|@n3?cnn5ZF2s~IWyj4#rujBPhUg(WtZvA zdfJeXSVL!tN-Z4qgZq%jXX~{(7Z$?Fz!6FvUMQe5C~l->(0Y2io9!09yc*0*u+~;P zpkl8Xn0n_JKDaCJcQOIuys0xX#AT7DQ@iIPfmM#9DB*&rFn@&&oYLg07OGBVGso4s z{=w+qQB|!_A+yvYN+$P`mw&HuvyI&8N@|{P4_#2E_rg#|dvq!jtR)u~j}4o{ls(%Ey8i2GGTYrT(MWHhdOI*z3ceQ245^U?Hem#kVGu zs;^%YIKM=9CVh?Q2QnNnAkxb7SrJR0ZGcSA?6a{FtlNH@PNu}x0zmP9S^zF8-ul0| zjt0K-rMwEGwOtLF?@y5EZY!^lx7$hA2VWu9Y>&k&vn>K{vwh;Xr)YV+bWo?l+^Oufx#Dk$5L@eK0YD-vfe3W|v+uBYt;rAv_8Z8N7{m!GM;md9`%fw!;(uJOSO{&@aF}_UKn^2 zW;~9<%%@@NkR%a9rf4-LC}A{btc5$ELKDp$`}if4>rwv-Bxpv=%QR}5Uea^5rn0Z} zwpb-koqr3|n0pWW``Xvs5~n9U<|196){?g6z=XsWn%&uvDY<1%^L>uqUIz0&&gU>> z+DJSu_t09)T0{1kq7b)PW%EJWNdeBmN=I3C%tbiJhyww4RJ&j3zr15^LDM}#Fvzj4 z|ARjXl6pDMW8u%=syWf7M8FfP(eo(;6*0M*x5XDGL{;$PtlBn|%gmjazfEsS%nC3I}ClxI?Ge z_c&>0*WUhqxj)~7_4F|Bf4r(((&G00^X_mbu>6ja1GdGpc#>x#HVF*FR>W+WV4T7&x|-P9T`Kb}D` zmdN((p|rF#V*!)OfC-C{*>K}yS+DIYk6COS9!Wm0@N$>LXPOvJpmh+Jmou{J)A$z? z(&cNMF?VQ@u0fQeu+0BKKVY+eFpP?2-qr~diNIoM7l7ZXzQy+_rYCN&kD==W$W8m6 zsnIH2l_b^-(G74#bk8dvwTesIk+&xwvd(2HGo3Gg5RMDEeYe!;DRS?luDPiIe)j_y zO{v2iJf7e+fvgx7k3yy03N0bSo1=P#gS7Uv#t_AYB^8*9Okg3!FyeH4`}8UO=WnGP zU=5}=OkcApbsu%8%Q&{3T8A%t{J3L)do8^6~CGV`&Se(a>Kv zF-goY;IRD>Po^Y4*b2d5(7+yj=gDdr`kU+@&zySKXwye$P|7Le_tIK5q-{35-6A6U z8$VNfJ|4<&d3Y23$_Go5tOeGUxJ-=uCoe5I}vqPZ^VY@+fT^J4QQqL(5BIy5fNL=4U@6aw zZj1hxuKb~`oT|<ja z#^H}bWS@r9g}mhdS*qN7bxxiaU$_ag8&G?zFZ{r)$)WwPG&o7Z?mDao`$z)%a};m^bb`2UGsn)YjV~_RjFV>;`o%g4PXBG7w0}ISJS>oy$OW65@a6C?M?#E|qn>ivzViM&&@xukUA98hdv(M~?S`YuK4h7%dVdr(BBTmV- zaC>bvD!O4KVdX+k8G~CS|-ZAGz>@; zDn>T(RgGS7KN#eHP!CRqkySTJ&8yX&Qtc$`_W3s?caMhsP8VB8zG8{;$`0cw8~7aNU2_(+WC5I zv++wxip9){_}s^QlgESczoNMVM^C1ojME_(&#p0ZZ3r{ggbgkc8`V!;JEdH87J zT~%l4hXj)-u8NLf>pXs*X8B`8X(Q~RF}j_b=5*T#on<%8V=zpi);O|#{D3Cuji2<_ z4IQC>({==5j7X86t=>xoIlqp(a69p{19dky&I)QC4j@WNS z*z}szWQz+)%rDyWP`&>LuD&esWsf!5;+@s&jvfciThJCF>*_9^>kLR(SPjQG%%HL{b| z79c??XLH%no!=up8;c9RZNet6Lz($BYH&h*U*5qs{jgz#t(sg#t70vO@tK-|Noveu ze^9+h!%A><+>#!?_7`cOY|Iy{ZuF6LDJ&f|$zbjm7Fm&46Re$vO&phWhC?cMl)MI? zS*|;7E-6hcE^V&FJ?eN0+P`rk^bpjqhv&&qgn-+#rqA1r!9 zIO@ya>`nRun+r(J*Z_t$S@xl7ku1gQa`SW~--p#M4>@^%K2-LsYP}d!ynkl&LitNp z$c4N6V+X@$L)h+AnJHVHb4Ols{@{a6q1SLYHFyrh~On4wCF1bu!eQ&`7^V@11NB#&H9q^X1ROU-I1}Z8V&k-THx^CavWq z-AB2vkZ#r=bJ~sHdt0UUGw7Pw`15v0s2ZVFzgYu0gS|@csQ=>R%x7LfFM= zHpxFfV+h!Q-F9@*7;4{7aiHahl;%q(+VrYy&GRt$AMGI}PNu^90OI6lC}(n`ivAO)O^&nd0^qX7Q*?+iSXS_l+0vUMy*D(vXTJFJT zTJx?I+G{4UDp99|{#G}@-xoOsz{qN6@Tn|UNUnv#Dy%{wvyXY}jbN#1qm~w8p@a{Q3LeGv`kWBzj>{j`EMm`>Vvj^#~ad**rn?(`F%CMn0)5X?>^6>9Tl35^W=O zM?WB|JK{=j^&DLbo$fK~wM(Om!F#TW2|2RA*KQ?P^wru4{v_+y=c=J*UAbFBecso& z3SG1DN8N93sUmC>>OO^v)7qLXTUvlgxhIs-8X_Qg;puB!Y+nXE+n{vjDxkhsau6Br zzpn8FZ2eGz8%WQOkFMgY$ISd`$NP*5Tina7hE3(!PMd)TI zuR<}iz;q;I=HDK+se|j{tuhx(66UIm=|lJP2ibx%2Kb@0h7(|z45*(%`zs6%F3 zqpP=#&fV?p{_LX_-e+8D!Lj7)nQ8w`z)t?cA9w$fCgNzt@V0HHpAXqB*cAUuG`>nk z@p6U7X3)awn7J>pXaF+PY|liB^_hyXyl1Dyvh*Vxa*i}0mYV(8dm2{Iv-m_qqr51K zfI(YpjisXPi0x6=bQFjxNus7P3fqqxu9zR&N`m9#dV706VG>eOs0Q(@-gS;tnI8A` z2YD_d1mPzdi5Q7{rY>k1e(Mgo7eVE-6~eYw|G_gm9P{7dJ)w>*PX{`;@^ka7bMKpO zq(j>Mq(m8>(eV2!TA1$0M3n$*On3LF>r}vxuX>7RfQ)v(pMEnmV+5(Xb4|jw5LsVd zyIaU=?k&q1Asjyjj-rxreR6s3i4b&F391#F+Z^g{r7&Y0PSOu}Sk8U*iba!@ghl?I z`%X-X$p+GEU^FaH^yeGi{>nRwxfk54n7e!iE|^MYT!>Bk>fIV6=(#a`{H`NIj`;KD zW)t}bSK=r&)t(_Viw7_r1!;k!3kBRw%cS$h&pE=SegornWQP=)QoHA`axE^rN=l(> z@kR%g^P6$~UZB#zb27k2LY>3{>QoaK^Ah1iW&f*oW%(CVmRp_4&ExQMRmD3R_?Kh` zoey3-ADkcEipU->zD9E4s456bc zcYf~3WcWu;293w08{W;cBps1%66=MaNw*!%_4ryr7Q`wRS2#X2qlcb0`a5;OOgwn`6e%6H?+p2|fzj+I-$jZ5tgVJE>&}o+h|j2KiSb}z0$e?e{802 zR8f644-b|z{R>q(U`xC;7tJBc7LYP=`h`AV6>6O6dMA%pJ?rpOz}{hT-08wzpGW-3 zu%BT;P_*osk&v8FdWE6&z0dkD{*y$}LlFb!m?9n< zd3qtuWShBh9Md{ibNVIpIrnfrDGB=aRfT}o56wvS$tpoouS5&SFJ!R@U!qIA)iVzB zL8{F=`<9XAH`SMH>4v5q5Wb-aDtEQQL$G|Bl*NE3zMtp)k{UXdR+kr~eUA>uwvAbU zeqZB)xxqv~2|>Z5UbCgwdj(k^b$|iG&Ux0pgNKD7jQSZ-MzHQ>Xt%g)Dr4f}-L=#Q za7#duoECfPr<`c5_6(*9lg++Mh%GR8lS_Y^Xa|nbWBaIgFChk5b67f9CewOe=VN|QErAB!{fj0sbcd_GKYv4>f3+pMQ-T9DKqIm^LMKw?nM ziFGdJr+?HL!FfI;UxD@%23@SZ+m;cyG4lC$)fy5RG!xJ<0O>cWusg|m1qM4qe|QHj z1qFK^$-Hp(D;kfJldtib^RGg_Z;V$KT6m@B%F~WJSBgr`pKgt0p?EC`s@oH5JJ#X5 ztE>Z@0Wmn9VbpUOZr3Nb*=lD~hQQ@+l2#Md7~YeacJKP)UTD9X^@%xG<^!K5Hv-*Q zweT^Fc8td$p2QvhQEd2Gp%bm>zu&YuTR`5Gm*tkgGGl{1BwUrRR5p{B^4CjDnjGqy z&J!lR)8uT+d-D7g<|-o9nu%+XqX@b(BO^spBkJNiEzstPyTad^YABDu& zWZ%tT9ePelmAD1B+jh%OWI6loB)4abT{&SUw5qDzs@*7Ks_&v^e5O7Zg9vvLvvsS8 zH-b${nxCJalYXTCx0}BLhYZs+tY;6P;L)1@@-dMayHPKObHDngY720}4~XjAcv7un zz&oZ=dG=_n0Ae)BnGS@s%`FXYgUP4HKEDATs4ZzTnlv3~ANpFB$rtXsvOEESIvce` zS>Op#AKOBFx}IGBgu2{>W6;}QA(AmV>N=2PN=nL`_5EV$=Cab?`c|^Py6x;7;Q|)0 zp0pb(@AlI9M_Z-|IiEhsKHTg-KS{Mmb2s6r2OQJl&l?5l0yAZ-{+$2u>U&^mC61X8 zwzuIwSmX+~u#rR=dvxDD>zX?BDkxySNlaU=sijmc-df_aLE;D0xks!>y%(Pk8CK#p z_YXf@Dq!H;?WHRTS{yPkI z+B)H>5=@d3>JK6~ezhmXfTfg2gp3QxPw!&eGboU#4Hr3{5`74&Z#(AU z4%LeeQHWW6s-bc5UrI`TA@b2!^uuMdOVMg`L`W3a!qn4d3&hxc4Grymzl$rF zxr)Cs3#c^#=BfWiYN5KHy>a*2?)PRr$d+nBO*P(PIo}9{HdVMycXe|?1LcmF` zzraaFeC%}pwna!O`gpU9e{$Kepj8y0c<%hH9PNacKu_Hh)i~KE{#cVTL@8F zBAR3k9h)b=?tY&>dHut|XiAoQ)(C0XvHCkFpGpd}V%DGc*7@>LznAx@+aB*{2v@5P z8^kGbcdvnOkeRvs<-&$>DdU+_)zRX383=jj3skh5K~yD2cPE;NaE)H#H!}Ic%3Ze;n{E@X0-)`D)Kap$= zuX{v2NjOMeiM2AEZhg)AU@}oLPdN_F6h+ytM1b8PLU!$?glsXg()PH_cjwpXmVtQd z!{3;*$0MNt&HcXc5#h|Gl)NJaj;JxBL=?HM26Yz#Kq$}Fip6z&YbAKUH(kP5f8i9P z623K39TfjVJ*gNUVQHs@FLdfAH6VToynd>S44No&x$TiG-;k5!w}F3G5b`oIoEK)i zHXpT6@A;=+8|58+`=MMawd+5)LGO98ez73C?@Tf{lO?8oJ|$l+J;qdx5#v?22i zof;~aMV|2iR4Ug#{liMmZAVFG^D5iPG4OI(IzO4g8JiL7{=57bu4Jxev(&NKvV+SE zs?yY=`^yn}Xs(%0Sn7o@ZaJZ|qTZ5e;jcvnh9OZPV}hzva! zio0vvKZ8Q1$|cP>>sNr*k#%$E>t-gh9$GCi%L z`#03F#qH-e(P_WWE;DJ#3C9aJ_Z5L*gQT-ey+>~IE`S`2=K>?dOIHVuU`|J z+WuPQ7ew((*iLXuG)WMuOM{L~p+LiSoOBdxqV=bGr4Cd@MYT+A9WI5sHf5BZ(a?{N zNi4q5&*Nne%}d7U*7_}W?hF`J`f1+X0bKPV_{y5LCL4f70)M0vR~_%+ks8JBUp%m^ zsi9@u^yYAj_tY5c#6J4xJ}&TZFG{DNk@(QaPYu&(!wQTL6Fvjii=WLgJ)=F7TM;j$8I=cE?`xm0b`dcwcZAyo(Y;brOi z(&jiLM4`#a@L{TS@jCy_UTx=aqtoo8FBQdtm2VS$B-Z)hFBFtC!-x4A8yEj=N)@mZ zx{3 z`S;v#CtBj^;+wN&ZL_stxD-kfgUP0QVbsIg4l#@pnSQ@f-j~iDHF&O1pmDs)Y{pof zjkJj?%Fq$LvkVvh{Rb2s$iUIYJAYRR`DdV*^dQ?VN2&s2kjd;CvkO`sQ>Ay79#k?% zJ$-LWo~{b8Mj&Yx^jMR4bVnZZJ+C<|l?iCBo5h+{cE{DJs`GeTU~Kv<%fHhe=()YRhJ=hAx*^tk%Tjd73Qg10ZvYBN^}hKe^nz-25~DG|!VW=ib!8 zjt8pw-hC*%WPgBsq6y&0gEqvz5{W_y(Nq*IaMCIrUy3zWrbpf=jIdhqOMo<5nYO=| zO6VC&5Kf_KLRbCP#AjW$f6nNM!zEF_iw-F=n(m?#h5g8G&wutW8P~$aZz9vnl z3$_Iv2-d@p0Z7!Vt)YcIQjt?^qhuWB^!5T`eX>I+!WYi}q4szt>};BEVrl*@A))1u>Kiml z{66}OFukF4s@DMZ@GMB1I3ETURC8d~YmNeWBU(X4PofQ%v~;WNb}JDx@^d`uPLoWX z{rz>z?>c^&dSk?ZLr#$}axF8^PR0d4(NKCrNHocDFJciqGs(g|#FtL%32BBx8^PWM zrh$79Q*E?NJElknHvxgSfK#L^gjefhaTQ;`!cy({=K4D+ThsO=!I~P=FktOz*~B1b z8UP(DB{eebzgIJ9_A9T+S;hhuG?<1IVn+l3d!0HbY=J?h(aUU+mSHy?xi;C9B;2E2 z;16s>kY0)d*7Wtu;^G$S_71r8Rh_QZPVhc6_>mlt8sd(rDO4bX?79o2*f(K+M|C=m zwr)z$nJq{;4&}qctRq>U3oxGVNmJ7`<=%y={R53RFS-BK8==_`!K@R1GZ0?1r}=Xt z)|uZu))LpBr8^zW8wB%}eP(J}&&!P+E@K%t#-6!cLme%2aBi48LjG%!^w8^Exry%R zPYZ#xH{H(>%i&W~0@jB$RQz>Z+iiV62;S3p0q@oxzEOIeuAISUuE0$hc0t`N^M@ z`siE>L`sSP$h}OjUw;G#v>NA^h|1ykw5gX08*Z|Zqs5@ajOwAIb_qAs7Okxpt@Da6 zOg@fFOLx>(nK~9~0+w%N8}E5R&I=_n14%(jA)0YjF3wrkga`LNe+K24erKonU6k`F z_Uh@oUWeHvt&htBibL7fKVqaQtMaaO{q&NQtjf>64g=l&A3H1=3M?NDO^zqth&T2Q zse|m<@tIV4X+2E!3Wa)M8V~H^3X;?BT?7ukMX8|2ja8fO?elj*XQJR@CM07Yhkhzt zwQO?YqX}?3k~P{_db^sryLAHRN_gN=k~Eu30|_ zI(zWXzwD^OvC!93(z7X>%^B_+r`s46@!wE*&dkzZ;!(PmK(+Cl?Gbw#(b4C>2apeb zDd!&9S;l>9zL6{=!H^|1b!`6izRHcuJDh^aBXNy0OpbQ6juZmj@ctkL{Q z($)GSM>)mh9^eQogn#*eK8TGw{ny?I(PVY%auWBQ>_2h|^wUw29%0^ke&gNcdrt}uxz$~q*`deI= zi>+y+doc1_^JA?7(P^V<7qH+j1F+GJp8D5Sfc>{zE{S~%Y^!%h^#J)*R&Vfy_2g9^ z8lp5mpClS)8UeWy^JVplzLgcR^)Lu|@g(0Zd7}b*zlnPO*_2@xg1`QYFp#=L#!$i` zdtqnUrFTLrOBfY)dWrKLjQ7`3f5WbF29$)RtL%eeJw|+tphg9~uR%Df`WgzeV_=F> zQpM2q8X$tyIRBHB?r5K6@Qi6Brrs!8fYS?tpHw$WdN4_whSA=g<aEomb3cWMdQe&FOI_~Upg%eGqf1wrkk1?i!g%&Q0OE(D=gUj08XH|bP%tc_38DB zm{wrD+ekNg6F?Oxe56{;`7_6c;Isjc53bFPppMj+*xFblnwCOSe<7qgaHHwI@~`*0 z9bMeyOv~-6DzYs`_i-CGH;NRW6(Uhz07HQ}lVNHK^&S1Q^A~Z<(`0c@r(U-w9zbH` zW)H6F6qX>nyZX}i+CVH(>+G}JO!qu))8}}gxk+`S+*>lPLluuY`iJa(u6l0l=I#9* zQNCG{!`f!KTzs^(HxjS0U==jZ-L)klX5C(5s(O1-?(?qofm7Bg`Gx{ik>m2x+M`Th zU`SwIv{;9=;SF)-UWX&0F1a?j%q2#|$=}Pgs(ZjWGV8XYzrx3MPMq&i#kc6|2X{0L zdeiN-3kPc`vscX@%v)t5QWh3WBwVH%ae1S_ADC%(pZhPY^TDFFL;@VmFzdBYmd@(CKYku)CEA^;8rTXTh_msOnTEz$Ho zCdU|W9PGF7_-!>tsu?9y{xY*5#{ntZ{X~Y2cd74qlMx3`NKOE~rteJ1P1pKk^Wd8Ji06f)o(-}bN z)YE~iZv}B$Dw$&5q)ImJ;23SKY*Jpwq-&>_$xs0EODVbtKw0b?SBG^yylg812e16I z?+a?{$Otqz%*+#5i5C~7%b!c{0$mm$;{$_{YDW$ZOzlx8?e!z(_a$0V8h^64o`db{3cCaJRJA@v{j z%H@opz!}$;t_ljiazNCqar~09PU{aIa5WVkVym+O?py29=a7Wuid554fPLk1nx0KS zl-Osz5@*{Dt4VzGZF;u8glBN`kMU;U^-Eg~CK=f9!F8pBEE0gXPy zdLR~cKbg-&Pr+6$tAl55Uw&mU1&M52^2G%nha3Ytqq`mmO6czF-ad2?ZU1Oct=6Nju`W18 zIXFfGt^N(ZdS1r$jy-g6X>pZ@Mp_S&ak=e)sd=<{>Ik^nf&C;t-ediPW1^TbUfkd8 zmrVd^=x#?QXx0|@`~-C1>tk||krxL0ApHT%jLKPqq|?g|7$$-kzsAx3;Jx*27c&o| z>wuk-1GRQx>1x~T;HmwoqwQS;7efJV^RF#6UYko6@YMDBdw5LgR~WXI1%1ml)Und) z=IquqTF2)&eZT}9cEU+*Y2Z=V%+>^U36N(1s>n>9BjVNf%;aRKzR}U|oBPKju=Ae= zYp69>%}+QCaCyz=`Z;|d%DBIu>APAr-6q712qF>5WBW>9vm5c>gBdww?K;V>Ew9lV zM|!P2743A|iW{$rm^>9gMnY=;*Y%@Vb)FkWLV+56Qu(gpQLesm+d+5vdzBFG&1|idO|_Y`A#6vp@;cSZ+7-8$+S!17WSHCfG--mJ_IX!i|>eJd$(n7PsN6=uvE zWhco_e>z3lvE~)k)xhLUAn+|hp@eLD5Z#OE#iq$;s=c-r?WEQ3rHndu-38dt7{n4NA9ebw}8v&o<=C*0zpIsPKPY5%<+!LRt+x$tk-!dX7l0Q<$oqm`G0N^6IB7rP1ULAYjgrRZMMXn9}IhLnw+b z?Xjxzs#!|TF9T;>_v$id;BVbUYvu}Jp1=in~J{}bw*FR;oxR| zG85yZ6Dhm(J;>ZxjTJ}@oX>28sHK&)A81rl-+MK{CqJ8S)a`|;X9l(}dO;2RD=R#- zm5!ZMStNAj(qfqD5>;--D(=t7lskmA-F5Bnvd1;&Phy*vU7EZ$Z+2x@ zSzZ65qXEvSzReam@&^nwqkV{rC&r=t&-X^fxqgwr>Z4k~?xx_uLYucJ$D3jSIbe#N z^2N1DiVU^Ty0%oS^m-i+4K5$ZdAJkdMa@9 zds__hwop&M{r-;z*9GU!yz?hdls)k{8b2F+($zWvjT{!Rd3mW)q4}`e!y9)$yB;|_ zPn6}<4*Nr)rj~{>UVA~<8%-zuzJ>vZwfrK2MhXY^hLsZp2KPhf$_e<$NNMv{@7GEl zlWGgYIlcn>6x?Q{+Kp`O`NUgq#h-udK$wNos zHixBR@1K_Z{G-sUB#^|y3T%S>QX`9AniXt64u(AtP2^Fb3@aVJD;kn}o?1mDecz^p zneOh#DxV86u)7+2#-%RX(W%S{fV{3Aa};HhTEiw+8V4QCHYAz3t>GcGGAv<(4}qEe zY*n80D~Q%Ns5xL<{ig1Yi-pS7#S|vhbOn3LX%BtwKK5Yd#SEoInbRnz_ z3I$ao!ORs3qJLBk?X6V}t$mXZ8nPQ3QTLfxrlnmueaAZG)uB**zc{^ZX;jeq2_rKQpaK4>)t@Gi$vt07%1kc>@yMJ|ESNU5oClaZ=h_=TY-i9L|uc=M_ zq_h5-I^y_iLBV}fR!o5Qjd!|eFKlBR`#$hy_1>V`NcCmYtXLH^CN^#~ z;Ny_Hf zdW~l?LB~it$&_Es*-1u>j>d_oK0)}$^z;B%PixK&P(l#w@<}b-KXiCm1HLblhM-K zAw&U*f@#`7ltjq3utkkb53!y$sL7h$iKZl%6FaYu#wFC*YQ0d7Olua_x?B07JuJZh z;~DKiSX%>M)Na|&rJNmo;^0CkTyw%s07T1Iz#Tyw^ z0yL$m4u0>vXwulBkII~_J#*;a-=jjeSXQMI=W_&P1C#egA2kYy(qZCCf;-G4-Vt7_ z=KX`XRh!?@LkU>O?rsLi#7fD!$d~cH%lm%P$kNbz9#&3ZF_k27_g3giKD-kInp6E=Kll9X8u$T>4LO*`3WD1o@ z4#>^?nSHkvNeA9TkN2;Ca|2Ak`v4|ug4)EXpvR=aE%*(c?szI$Yd)R-$AvGt2Th@WHR%=wd* zoyF-%g4PovwRVFoLhr zyez)mqaAwhPw*d;rZMz&z{-Hf;P``o(Ww*k-v19@eEf&aiD2-2Fzf0o5D@5o{)ayP zzZd_B(fIdly&n%^xT0zW$hT*I{P*HNH3;wjy;7^C5C1Jt5cl}M7X<&QLHPGd{dSb0 zaK%;(hyd@t`0vGkY7id%d!?4#le*$62B(+hpZ~r1PYnXWzgMcY-}=x$qf5Xo`)`qy z|6YIr`M(^5f3MW%Te6Y=@*hm7lim4lT+-Sk0U)_~#cBWCefx;BYc@%pj#uuMKFtfl z!8euPmlP|fG?SGrWon_Tx0d%=64R&q=Kvs_;2RHcjgo+TolWEM)}Fw}jB?5e@=v`J z<4PlLa$2|)DV>oTUGCL)lOD&ESAL2ECHO$Pq}&<%T8#)9@5=!sDiNuB*gY{7U6Q~J z5G;{hK>f)&8I^0(_>%WZm#6yf$D1a}!AhEXFwyNYN$mRp#_}2a#_V3hhFY`LTjb## za4E$_89C0E&;EJ&pTI#BBW=3`sO@di6qTT}K<;F{f6U(&aK=!1M9_PH$=dA!|J%D) znmX2MSH2&A;CJ57udci|YcKF`0g!(B^A8I-HHuF(#3d&h3+ zWS8s6!JeS)em%Zr?X0Y}9zXAGlT?}ydiY$|_>6#(&Hp~AifS>hL|ta12!o9HzogbH zy>bz=!q)uj?EKeVcUNv>ZUF`lZpykTO_*horT=s3fcG41SHCe%evrVPN=~is%ZG0n zu~k!==OEAo8ixetvH$ps|EUf8|MqkKzc&}piQd`{R8(>&-(&Fy)BCg=ZeL41tt;`p zwn_x7g4$O_*Z{}`?In25WSA9gFYtwN`o1@aMNBv_pWBV#)pe)%>}8gqw#R_Vbpfc1 zYy$=Lw@PtvL&XSLx?u)*+v@M^>QvbEE4v)09*zupU0d|B?t4^SIGvDf42z=7vZI3L5QZvpg7;B~8bg%8UKIf6wpOUSj9(+TRRdckx&#hA6@f;3Tot zACi`1p7_gD?D_kpdoBi33qbo)C3Mutm5XS#!4k!l2xdt=bv|xy@$yTr2hWFs=cRPi zW?o5rpaH(Pu0m9HJqtaHB0Vdrv^%J$Dj+pAF{SmwN#+dncE;hkjXNn(Zhq8_Tj0-?-Y&8}ZMrvp9w& ztaB-UB(=h&TwZCXkX}LL923 zKGFD^xN=`sM{(EWvQ+u-Z(!4Aiu{vb#4Ug2J`2BvczCZiSeWq2y(#}F_AFBqz8jm( z$I8)mipe=uZEioMmjx!~{b)Jro7F~UYxEHG{y%RJx_X0(A>0g3UWlN20M9lts0Z4} z1l*KPy$(13S#SJE;Yv;@ltyZZXi5d{qq#4hyofy)TMvo0&szC!Z9) zzRIsmlT;~u2OnO_lKMoEo~7GT@V?-ZP9=+!DM^baxnA7TetlsfoCVMlLhzxuh>*pS z^EZv#Ztj=26>VFo8;H+7`5a=w-p z8Zn!_s@-k*P#ikLl=yg~3X__u5r6ivJ5wsN!%V-g-V_)DSdMmJ?wJtEX_=^7p48Md z**Kn+Bma}T;z7RcBZl~#+CT>4Rv5oyXpeBRa#)AF9XRJheguskCmuz|DGf7s-fIqH z_F3_#Ny-w%hbLte{@31rj_D3 zik+pzI!Re;O*vKE<6t>B-S?TvuhyDSsu>DaM^p)+>yus%xS%eaWa2P^MOh;zo$#8? zYM+d&tB9d1N(cz-;Zwf~=Thf6^`A<32GuQldps|4>EfRcJCmnD8b=tIOxOxpgM$76 zV*q#4`DT;|`mpu#tcaqc)Mk8^bC6YUd~v1l{B*P+l}(l5teZ`Nn6BPp-)yW>xSN++ zaQi*k3s>!mwtm%+%*{sV&Sw4hnqFs7IuEq315hLn8$OWmaV=-<>{^B)=t$H*2Ry*M zA* zmdXAHF|nZe$zHiY%R~A+cKzOy=W67ZL0ZvMdJ~vrT_@TvRDZ}ls9D^^Z#iCePX9Ex zffKsgVT;Z?({^QAS{vZAo|aCKR+;F(h|BSu-ExD?TBYB~QqKHYIj-HpoddUq#mn1i$ppmQ1TM7Jjl z`K_&-h?0VBiSeA?=wf&Xw^HTyzNhrra&(1x7lYg2iviGU(?Z-s~kt%%4%-2S9&20FTEqGI~7VHKJkJF+}OM2)ZIsaX6=%}Sd*h#B+ z@I}8om=Hl7B>p~i()KCx>&c8060CCUCn_V+tzv*T+m#^FxH;KCTf zTUTQcYXbAa4rC|*j9T7~gxhp~O+qi!0vZX3^OjV^m8&J>7->r1!>B>F|4I8Z z@4@&C>8X0c*#@OL#gSF4uxoeU4Len_qwSYU-xOClo(b_d{3xpmNUm8f%c13MT0Q{( z&&o@W<~@#Tw^i*<0vo9D{YE@(Eb2hBj_~h)?p_dH-}N@$9y3 zY~R*cfPe3{*-l1)NS0uFlu!aAQ$rgv{A{do_#1nVOB;#qMp0SIw5I^hos?}ipv6y4 z4KNOX4w;!$mR)-%#~~zM0O$vGN5kQ9+wU5MkzXo=o4q(>)1^+lHakRAB=>(SF#0!k z6aCszjp&=`>+5F_JLtsUl{`33E=!fTP_=Wi+9_|YJJXIUW(P<~05IuZDv$yEoGPz- zUjcQ7ZjOR+%4d_g69vWwrqN|1nq#_{x76<@qnrYM%V}#z$ov9wM8e5DG~u~9IWya^ zI*D#yfMv{03i2L~yLYroU&o_7;jT;;7$kxhM0rjl4?{^DzMK)u41Dz*{6T0iPwfC7 zXApeYMu8$n9?!g0)5IjJjkF6T@F%ev?R5v>*K*}63ko^C*~YozMocL1h6vB^?Lqcw zkxToYf`wgXL%Q7KqfD7wN{dGwTRjKDsU4`8g@_9V8m}&_QQ5>=k&UlamSX1LU+lFh zZ7$)N-@awC`x}RsZcT(g+)z|(@N0jHi9P%1s1>%Q&LQO&y+8w#+t?`RyzfmTi|4K6 z2K1<*9ZAl-lM%PI1x_Z zUejHQ1eNBa83F?fBk|+ynu`D#+L;WEwc!Knz=gZ3c^fVb0JTxd{#uY!59z2JI3aRR z0HXk*B4pV@whTGEAg33Z5o;`s*M5mOncTq+AQ6i{1XlYKZMsdu<7RwT(NwOz?hvQJ z5HiM!d}nREoMv)D9!Fv4sII0PrebO*nE5efcvog77D`@tdJ!(-pQ=1HzQaFL>Q4KJ z!O6u*q(%f+p@f?Ly_=mKl;-(Zh$pMKnnggufMPE*n9yKC4v3}$?TqPD>sj1VZO%rc zV^x7;yoR;~|6PX>L5PPKopAD`4k#;rpnQxYrZrw&eS0E2_{1jXMc`R~SJVD*eTA`& z{_NgK@_fI%R#<=}3R)*Y-|s0&dFK<&e5PuObSiJWa?OqF{+L)YiMoBxz7DdLyD$Gp z1Hq>H)BAr0wYg7VYBrtTpqb2wz)K7BLDv~+u)TD%W2hl*`v{rwWA~6$O{FaeRF;o%PRKK@g`~5-DEUFaA$hJ4kWM5ROMA5 zB#85#7~_j8^PKR#Xppn@{L zO@I{K@56wBbdhkQA!V~Q}9L~3Qr}?Hk7mA|6(D4D{PhtZ- zK>Sx+-ELTr$qq0cOnUiT>R&x)4c}IeYeu~ub@&~J@N(QbPB{B3@RGfI>GmmMu!L-I zUGYO7*+MieK7Tl;kmN3dbGJ z3aupTdv$}(2*OGG+RWh|v7r@yKxEfQ`x;x{|soF4okJ>GU9^5#5>%g>5w}u#lDp7!A2As>Qy0 zdWw^9@+{(1F!VUHGnYPQ$@45KbVROwkjYcktF=(u605oFO$<^f&#laD+zehb$}+Sv zU{Z4N_SP@Yg-gGD9(qY8&|h9?i?}SbQQd3PLa zkR3uNL}Re}^9crV0${5$*lo zy-eH%<7}y4kf&r?dc1`B`6v)S`1UklX*@;OQZL4r!FfjN7MV%9 znv=fR6*;Qwu7bW1Xr%aJw`VO_IU#)kWXfu8Vb=y@Vn#P@_dvTQ{$%4~BoD{g8&WEQ z{Vrtg(}(r~QWgyFeiLY^1td!jLF>>bgG(W1GJB(0AHRQ_#B}D!&HLX1q-Nu(E^;tWlE$X~47d zjC=*Mw_+b)5$U;+$(L4Y;Vrf7<(x=wEq`|-x$4%UdHnAYcgW9nu9SBN8@(=E2SwFd zXF^4HY{x0jLjBGG?P@|=+K?v&)bbH#KU!77XMFMK)7bem6Ta|rQ|MERd&hUPbZOXP zH9w<&tO1RFtTA?`j}^-Q$~6i!iU|TY>3Ug9i(qx*H>i7tlluoJSuYD&uVob8KP@q~ zxua4RI?!lk%urSFtk&9n|8wQfvp`5F4FfKk?^=K8&P!>Bo5pKpJwL&)1p z*ErTVH3e=ay)!B>fPPD9RGrI$e1==x+H=5enFj#@(*^SA|(ZXIlG0 zHx}KHjjeUH>~DXKt#PB@t%^}O?$6rdV0(TSJiR5ll`X!0it88YRxGSuq{=riu-q_nY>D3ZPmj^X;*5@-cSm+ zZ8w%=ecF7v8U$qFO~G1dVX4j?M1r}|@>lk^^!2k@?_QgK$L7_ya|XQpLZ^v!}0_xd+&#z=unMv8yL6v%C5lOEs3-#B9brjSQG*9RkyLUPqKUfv97KN zhi%n#{TP!2_qiJPc|Z)m*#50>N5;|PuAa7LGP-sw0Q~(>;_ffwLNO_t_E&!=JPiB# zP2YM$p*K^+4q3z(G(L1FB8%+0Cu#BPBHb?@4p&#xPJ+kfvfGN%xip~lC5<#RT*tkr zpit<&hEsc2%FHKwlnERM41UMbD`BpM&2s=Yy+0p-S+QbFYQxvsdUPyRB#=jTxXHy+ zh>-`M`bj(6Ru>4(ak|C|C+`4Y4sLgg4;X8vvbxRF=z;aB32Cl49vfC_;k%1Q+AOoM zPUQ@S28!|7>o9ld#QVpxPNHiciS7`E0EZvNKX*kt5#)N9HPD|dV25oKs#I%v@uj1W ztm5I}u8Q~3PNb^n$|!tM9pGg4SuU{B{7*-q6N1=TBEI04KR~}2&hNTjT)OXWO>b#q zZgKUj)7@l1OIgV+k*We3X!Z5axy+@twT_bcWYF6UT1~$wbc})EfVP_2gYeIcEqk@k zThsIV6CVC)65%W8dJ6)G4qs)SwCELcl9J4eFD9Wc-Y6+5VLahZ$de4NTd5SGa<`1d zmw#OgDmBvjnwaR-#WQimnf$PguX94ucb+~yGL>Bs-WBb8Ha3Cw>UB3`qcQMV!$unV zo@p(-v-mzMrgK+XW8!7}-<>;@u0Dpm9=$tKLw?K*_x`vXo745Onc8PdUv(4r6Os;U zqrQ97UO0Isb-AQ)l-2KNxgF@y7BTk7u^tI#x*Jdiy8h*aI2cq%H|~e$2xi$(kvSj} zirIleW@hHBW8FNab%{%dJN0rTGNjP4(5Ow@Q5D|h+WY(Qsy{}{M~N$IB_{`QGQ|b7 zQJtk&d8GKO7lPM}kq4WmmX;JkV@9ejA@litD==0qt+<)gh@doIX(?t*fr0|HYmns= zHn#Zq*aG>x(Xpv3n6WPo!yV3gMAMTsLKm#Biz8%yS$V-2K)=BSLtjLOxDNvelG;)dsq9PlK zT~Jht{}v<*aN6cuzmx!eOd4p<{x;9oFXmqKmRyV>Ufg~6e2|Q<-E9AzXiQR)@Ghdv z|Ma-`$H%6A2qN99{}UkG_kPOW>6|dbOePjotYLO$$-GE`dn?2%paMf)rUVWFR9Y}Eq1pPLkj8KezqzF z879Z3j(juJ=B8=BEZpL4K1f>3Tm&>mvo&_ozI!MDW1F(C1;*cV>Z_eVRh8`b)_jF@ ztX+Q}5X}?zLP1F)UMVX{93+t0+5)`dNLM)4dpv!FOsHfB<^$D^@FHWP2?tV(8Kr-v zm4Fx_Eii!Fw%d2cz>(W*m;I`VqfD z;rhZ)8Zul~?|sS_-5Kg>Nj5)W&@2^?<3E}Ja!V825T>M3m;yIt)yxi90ju$fWM=$o zx%)jC6UP2y<(ZlA<>lq!VR(GHk8gjU%r>lRL4n?9BX(kX#}@2$kYz!5UUaBbTJ%qExi`ZK3Ix}3zb%d;2 zPRl3N}70N6Id6{FwK&@HldD%}!ehY<}v%|l?%Ui1&m?vnnQz?Z1TyT6sGqeV(v-H$DNv#XKeV2Z%PxpM^qpzzyg=UiG;HLB!f+4>;anYmHT8=S8-37US%nFnPFIr zpwD#jz`O?%yT&^&8esW-c7+yP)thK791zE@>c02ly0gkNkdE+OTCB-g3P@gY3C6{m zC44CKzg&rI$XNg$?QJB=|9FL;w&zFhIAHbH8Mi9)+j0t?3dJ>r@=iUP7O*TLvL%t( z6wPvYwEDt#cg(}it(iMN67OC+WsY>t>hR4r&+F%@JK6R5&4Kw27KEMf<#_zxEvZk1 z@*o%Ip>)8uC{4r$KPHvK-PTx5AZ`F5{0*)ShMBjNV!(Wo?m?PjtV<}I*dy;U?nef< z$zY*ojyBeEMq}Ho4FF@T+_Lp@#Eq-YYB5GkWog9g7k|YUT_?TeQnkn@X(_R(0_M0) z;En<(-aoyn$pbw}Invq|sbBw^u5|UcQT$BFv^}$9b6&o@ahi^h-)_%nwOdujWOJ7z zG0Aqo-PHQGcT;~>F4o_8Ki*x*#~rmkvqM3#lJ5IdUX45%wfaunQZG$%Lm?TRYm?Nr z(bxargI%^38ph&5gA`u73c8Wa&>Xf1fLv z-P}HBXj&V$l!vCIrn(;Pvn5Z#0@o6-q^T-8d+3Y5Wgpk|O6`?Rt^OSo{0gE?uId6F zudy;|%Q5ZUttn(3j)LU!GUu}!R_PiV5J10ibbwJ+xpcONh?a1LB>c8nO&^(61bSZi zVB*A6R9s)nfub7Es*NQ1omdJg33>n@E_@Mh1hnqk0O^J#IK-s!r${g?(EaQD0$x~& z>JV;~c3?it5G3>+58uf7owm$OltCOkMEic+f(4l$^{hn7ysNXVqO}`Dxt=`eqMI-A zQRSzN;l1)iXfZBZPJP22MCrcE{;DpO^Tw{TxAQ>30`<^)&?Fi4!@b#KUZ6WV`)6fc zp)Jn1sw0N_C^zVhl9C8MJI~4+ZdU|4pWsPP7|4*XRRJblsR=5{5MXf#0b(PRp*yuc z>8`x>^^J|<%mNscPMSf5y))J{VRbYQ1iNL0#c#={QkSRvBBeVWi1+1@*n<(k?XWaA zop1?9Dg@4Cx+xNq+vMN?HY-O6xoV(jGc7vHnMA3efmlRm5kQc4rv>C%xGn7ps+O zGF9}OBI~W%JgYMF#V#8uZ&qvedXBo9n)GT7Rr^=6C8LR)P8H5 zvAtWcZ=MCzBe_lIKcc(4IsB1M1I;H=zkglpEDuEjq_!xzav159;Ml902+`?}OOyoq zY`xIbA@>KJYfjt+$KI%hP~{xf4xp~kv?er6;mycGnm1V-Pn}cnUloX5> z95lhT;N-R1LuUkuV@ zXH`#>PjMZ2jB1)f73y+PLdu*!XCCR(dP@SZ-O@hT97WQPz;b@XPx*XgajDDCbuuc5 zisDQ_po#&c@gLO9Nm;Ej8V7$5n`gVjc-b80tkw+j9>HcIBomujT)E1L-2JC&Lm3ds z??2B2&b$`SYl?tZmz3}Y=vm#GmXnk1SSylVh!KboKYr;fU#j!q8%S}q(D3)QfS*#{ zM@AKH`?;$rJ&qG9S`>=fe?>jlOBCHmUZO=s>{6^)c3zOyT_e{L+InfL-&C17y?((r zl?nu-?_hGm#Arq>l_*#U{0p_^ z!#8SW`XlY~Dp>d7QDZg-(@0t;V7||5XXmyCGc*R!-aL?|x00n>ymdau=_6EpDSW+^ zdM>?}

se`xj+pG_b5C1VBN>-R$!hvMh8eDeiq0seZ?^ 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 literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s3_canopy.png b/examples/pcg_facade_tower/verify/renders/s3_canopy.png new file mode 100644 index 0000000000000000000000000000000000000000..d72d1c4ccdf16beea9d7cb5a81f15e75d1916589 GIT binary patch literal 85804 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/i7YqE)5}`qPV;tJFRO&pPD)*w zpmp03T)i-K<0}I_d%(#6Y0_tqz!W)mhW5o-NK0jjbUD1rEbdX^=`pPRC561;?9%rb zD*?V{HJZy$1t9($FIHY^;*R6_+QaMftQGyO6GL6;n?12iAUwT;kQ6WJtReY}!_C^S zdGOsM6bhx2xDaFUsEmIwBA%oJgYjpzGz2!Z8E>;x7p8()5rc`4%4-q%@IoS~ zK=inXff{|~77D&wxqC^jDVFWl%d%DUY49yvC3**iYAifyx7!@fdu3+)m=Q=RwaAD^ zxgS)67DfJ1&sw5QM=>}8&Mjgf$>6DK#r3cLaKjkW z#0`#?|3{t1yHqT)g=V<9>Y^kXe^P$>Ja;9o@5ows3kiQ_eFlAKa z@^QxJoSa-OEiKQRRcrR}y>dYF;2N)VtyQvlAUMP^QR`5o5Zb>S@rYN`QQOdDD&BdP zx|8!Be3;)qbv02%`>jk~$G_>7pbB4d#{8 zAhcOq&cRh{qT3T1fnI9al}Meq(&?}NuwT89l!^1NYI7Q%@iWzD0_*()`Tn9=9(o_e zzFIg0nYuiCCYeTl`;CcpsMUQ&4a9^xn`FpzLV2b`R@PrC!>#AIv6~OdE7$3^CZC#)T=UXDh2OOZaC*#RKq;^~J8^jGy7r!+V~Zk|vEm zO};GE`~5l>DTy(DWEQCE^Q0!Yd%6&N*_ifFJ5S7RP(*#0Lp0DvG+$C@vdZW1>yQ$Z z6m)9zTxBNXtV&MhaE@FK$s2EGL@T_-B;p%^C|9x+ejn|oju>o3YTn@yw@_G<;?u#TuJLTrTcz)31y*NNH6W&bEQcx z`Ao3yJ3e1N=+@sU-`0H8{`nnd*azjl4kEq`UAaWpoQ*I_g`81)2qesI9hqfi3A7Dg z%OCc2<2GaU4x?)7Z%F^WVKyT1y-h4B?_uz~sLz+b=JUC)%vq4el#Dnthl>i8KH(4G z)uxNdtV)Zs%`05c4Yyuivsb4JFB{nYcag=TtkM3Uc+B_c0^#K_my3IZP-P|C0QR*=*kXaUfd&Nd2%Q6v3yo=S9|$poa_8x#7xdlHKoH!4M6pP{mP_}KY@YmVbIS1%r3*bTcst4ydm zhI;!ve~+-}T@o9tgPwo8dFg?Euvu*%ufsoMD($s3r{@yxl*SxuQk6P&)qO3s#|3Pb z(TN02#h}a#*Dp&87^6j6zVgp=sFx#K&+KB8*kpW1>xo?@-9u~#-re91N!8gDJf~0i z{%j8WTF$jANhczM_gVan7017PQK7_-!3gmBi3DjZ6puMBbCdeW|$BX3?cF6sZ6oZrwV8uHE(OF?4>Lhd=ntQ?{)RV9fvOx%J5j z=#{Ov2K?94yTumO7KvLf{f$=|_?I?ZFVbr}A{C$er9(z+0=t6eP7^$eA7wOib2ufn zoBIn8gcNRuCjmA8730%E&!uH@%Ds97Tj9ZZQf*z;Nvq<~O~}RTs+*+?2Dz~3Z@Fp1 zOvCHlLzW{3tug+6gHl%JfhTz_2T=Y`yF4q&;Kk@t|r^-i_>*?@;C zqejCM#yGOihxUF6w>h$F5lW*~HtH>wuPg=YtqG@TIB9ml6$(F9z2Cl}*3-lvlVJ(N+ZSB*o3m?akyc~d&+Uiq%c9Rxv)p!L)%cG1y#&7w2`Jpc^pFR_R ziPqJzY^y|eM%;Ve-M#1#a zC1K+dj+05dxv;6*4mRm*sQsdo~Hr9nP%0 zuhl5H%Lu|9jGOZ0)ysSA+WXV4?Ua1mNY=?r^ea4;p1fs@uJ$ZAKEFO<@2|PM0?ORs zDW&Cu=D)7L{V9$b0#q}=W*FX_=jbutt~Vv&*e@(Glq{**AGufb&)!Y78Q{jge(VC= z4?I``d&b>m_Gvo4bpJ(1v)I6SCKCCVB>>w+7WfA)=2#hW z%dT%EBGFq{z7oZqugPvKTUEOIvf}sRLM)rsX^rxK{ngdf=5J?A+VgLUcbQ{Sp7n-k zA@G{-k9jTglSsYz>ed>rRr?k7F?@I93wlsf%TZgwz7xCMH=27o7%u^BJHrvO2VqZW zmI4O5?nDuiCug~%_N>Rs&DYp>NldXH+GQn9PULHNk-XJ%424#f1q?z|Tp1%5)*?pk zD=BraUcLI!_G|w0Bl)xL!;XHi%>^3=DLh)<97mPJ>#Jgp>hdh78g#7t*L~nvPE6+8 zm?*g7eOj`4$4CDq|J+PXL9BhcrFEDZG1oa%rHd%3z9Dz;eQKhIb*4k_q|<{}sG)Dl zZ%V@-MYP@m>nB#=&^eUYbCWw?^VS!q^=T#Y#bCSq$M4gWc!D~*QES39eICxA{4Gu0 zGG4jrHuSZ{3(O2`THR8#62;Ve_dwU25Hw`%WWa9Y#|LrG`R|b3#wShZ zHDv|Yhs30bG7c-=bn6bywhz*takgT@FCc#JxKA1d*4Xu4ZAoOqK`?mP0F&G_tdhiF zpDjN!x<5N}T{@l$;huZ^a)MM=Iz9v$*W5)0 z-FkR`QBo&ITLzf6j33}7^qJq+e@6q9fo+w?7+|Wh5c$+ zIbuP*(rd)+Il|M~thPa9k$pzIO&*heAcoLi5Z$qadgGny#50sUAR*pcI_681JJ(r^ z$Oqz8y|p!8G>gj66fZ;P(x4k9ewuXDyxRKBN#MvKdzw?e>dKsBWl?K?MDrtoL+bQR zo&D8alecchsP42Zd$~%+05iq$fafaK1EeikKgYEERc3bL*eGM6+548Emn(SC+0u^H z37I*me(yz;@6)Gr_MmS|?#EF(Q~Pq26>@>L+vY1?&Ra$CfJVz_v5C3jXx*<2anvb1 zj{Cd>1%NDrncXMkW#SOW&j>gnU_=0I&2M}=PUR#RtV6I~+n`Y{a|3SSxow#w%~YD8 zA{KyXJX>`aBA$C#@__YZG8C&zQ@L7rdy_`W|7OW#ocD0$hsla{IUt|+1xI^{nHn~6 zZSI4hEpe~jZ5ti3)~ZFe=WNPffB8F_gr}e*i9UVz#vpN6kpMV)isiU z`lfyyknbseoszrjY@-mUUi=30p&9oDQDB4cK_s*-|FqjhH42)Zo(4dVKLhGT0d(3W z?P0<@wGx>m@Ym{_JG6@(^YRSvE7?o!S0HTT+37vGc9p-;Hy)e9pt8fGVcKT&tLzVj*y&CK5x-{nG8l&)r>{`QYOK2RPR2+Ap!yLSIn~%b+ z2SQm}kMUbiz?&SLLp7IRI}bOuP)^6)%<{*_=6{Y!v7{zYlZ>az_?Blk8_-6t#)X>& z??sz$M0d%CymxkT*=LQV!cTq^+o`jL%$_vlA}gY0eP1hV_ z3)~p9=evOzA};!O%sG`!{(#3%dsKT>OiyhS_(Tw`WFJ*My!zK~PW({fSkin)py(h1SP|bxm8X$XE`{fVIf z{TQH%6i}DX^?zjNf&`Y-&c{OL6eXRADH;LUL6 zK|t+NTc^xnA6swQt8h0(B6!SL#P;3O!9ZM=<<*N;ie|hsHUi$cRiXu}#ByC)3b7BxT?dM(HdQaqS7iQm$D%edY@QI!&xu-6;z2irS; zu9we*QF^Y@sGF=dLUeX0N-|Yg{lfQXyQva<4cEGex-lO7e3pnHK_Y?8ybGV(X|oC~ zP;7e>kCL`Auy{2dM0k+5-|)UdFmAAbbZ(Eds*Ub_^rkkORPb7L@BT>ifpj4tw+yg>=oqIV;Y1r0A+&#i&lAbX=E^tfDWmvm$k632oR4*wkONb)fsy zOvg>y_9Vi>Yud%fQCG~DJ3})!b6w)M@PerDY(r^`RSVc(up0f0T)sYf!GzBG0&N9* z12&kThBeeZO1MT{5FGu7gvZ>1=H%LQep(eQA?AF&vw*HsI5I9Q^- zR5f)cHa7fbUUyE&6R=P-5K{xhQL=j@-u6q;1!nyEIN(7e!k8oPo?wJTF%N#}3~cOV zULybIqI6lojz7l+#TeMfS@kL~)qmAHnjDV5#{my1ciP__OTnJ5`SEq;_K$o0);|wh z1?)MzV;8kw%^sR5`+vXFtebvvlXG;7qzCxD?}45qwtXjrjXoDD{JFplKW4JQBa)Zu zcU4zJaf@Hw&OXZ+LC9mHY`ck=W30;!Sf8d$v0fK|z821o-;5W6Ot+jkZ6}|KY0F+jb6f)JMWs+$BGm?K(h*2c)$F##6!nHyS-Cb3tcJRBc zKMNN6ZJpowJr zYpP|p+2y9UsaBYlIS_rnj1#1!awf_qyDs<%7t&C;8&q5>P-fSZ$c;6+!=$=pgeyYE z@6W!UVp-4KkpAygj>u?5g3Foq&cTLhPY+L|M|}FvDL3;P$CJ{U?!H7;S*Q7EiCon6 zA&j9Q=l}+g7*b9fKQI0`eofRsh;@0dNoxnuq0(-}=YM29VGP}pAQ?A*q*C^{+p0ap zYGLD>tLCzQA!yq(+S*w^&%~N&(l;B#Bz|(LjgrqN-ZFaz+N!FThS*wHiq2ld(6x6^ z@=69W@nCqvS^K;pfW2yTcl1*~lHT*-JH+-=#k*mGz%+x%N(04nEXH>wacx@|_K!l2 zV87@5?NPmFwcsQGDtU8gbfy}n{*S%%t6|?i#Mbe#O5ynXpY85>dMDDavn~vW#+OB3?ybU1|Awq3IX0OexxAO zxgs-&Tuuo3Us{*qKHv+<{eNv(*dC!YUY#5+%qS|UgrxXYDKfR7_+Ddh(#-)_-PKeUvcy_w{opgMeczo$xm z?jHFc|Bz8F$Qa-(C<6oyNWD#e|3F--smyg}YCbdHzx2k7{}o2Evw^N|y05=>x|`l-!0KQE@|Te9vA{XbYSE)1F>WPSc2cd;v1(J)q$vaD%jKCoU;c-}uht?GxA_62sJlRhvu>jlFUr&PQ&qU#)Yyv3-C+gaJqg3U8FBG{ zmG+NQCSIld`g>0daC}q}r3^T__noHQ4K8?SfEB!ERvDKmhl6VMpAe2Yp^q^QP`aI1 zVr*(`o`WeWUqT3q7cC{i$r1LuMbcjz+F!coj`N`5p@Yw&Sn0;^(D3{#E8P9D2>Hc!_!qv#>7UcmMgFcA&F{@0 zvWhy6rq?j!`MX)#4W&AGLa)@pg|a~tFsDM1pkL>yFT??*?sewFs=pbQd$+&JJtN1J zM(97T-uptnUD1jgHuLAo_im$#!a5HoT}0kO7P}%@jX)}Nnu7l-3kV=^r3`Q^z@FXy zPK%+t@GiJuP3uy9Hsm)^?0l)>{hw)DwoMuT(p>&KEs5=&4oY?0W}FlQkg{8ZKt}k) zcaaYS8j50mPQRFXZr$MG3JD78If*Oz5xBIHgKVu0{YwcAdUubgAh_$zq@I~{;8>Bb zth*^D1CFGts;nxG%h%4|k}2@F!q; z>ZC1=*k7~1AGc9FI>SOAV=|qH`|s8AsmOXfy%ni^ zp#oewRd&B~id5EuDPKh8fn3aRln}1`3?VUqmj<-HAz#7IeQ~M(fnRusbU^gvWIf2Q z7P)eFC5MO;Mq8R10&CMFf{fGDX?1aG~ zwtm;A3|8iTs{!HCcJu#>y*CesGJgNQwGxR!%9=`)WfUS}N~97hhRRmivW&4!_L&Ni zLK_oeLdd?8u}t=ztb@VWx3P_71~X=!kMHk3?&Dsb`}yPf=lSQEqoX5pWahd)*L9uC z`+S|}r}smrhV^pRX`IWiM;ChvY+l`ZxZq#<_g3VSWAV^=e&43jji#YiD*R+EGUnP&6ozy=&`pr4VB|Y~k z-ho_4vA)fneSJOXT&x*iri$|}(-4iEn*!Y(23D>c$7|mmHAw9#`;jgkwpcL`ne$2g zuHyhjVNotvDVQ5uYz&Y9!DDs4;cWG27*nWYe|5e%gxnh5hA2YRdm99*gbg z_U;@~De6Z6RRa$H{Z!-GmQ&Pp;W1JCGv>$18AB_a`;s`zccqd?UUPCP_=CZ<=X0MV zuJznc>q+`2S3rp1uJrGwu(1?tj`}_5{LeQr21TMXXJiS$6+eznngI>nJVBER4^Mzo zRs9RPd;Es}j}gFCuc5lWxDpLe*EQUo#W#v6qdVH>bvxqDg*^GyGdhBJ@}LXpYYY7% zH1(HbbXCKYc_v8ZVYfb)gxRIV@6u%;y>zokBWgE;4CLAGy{_v#61cXss(?V-7!xxO zwXPp8Gjg)Uj>}|Tx7k?rF=}j&S3|9r?64{sYqugbuURjA`_O5j|0)L_y8@gnq8M?f zF)nt0^^)=}0wPOD=&qJ?TF#mh1S^ zs>@9uc?zjMe0g|~BCw(M@KMQaS5bmn@X(}oGw2Rq2nU@JS5p6K-vuWI%20Wo(*H+U zZ(K1_!+A%h)s(bJz?0~?_4WzA6Q`vhB5K|bu6)hE--=}X3dmo#`^4_`^)TqS>;^X| z9+I4tQT?E)pbhk;czuJa=1l%4jAr{Ob44f*GXJ{`v&nBKKbn_PnXY!~Vs`py31jJV zk5ps~)MKq;{;NqgX)Tgn95pd-Z>agadR_{WC7Y{oR3qjdXJXUA5HXxq%d=Y&9j>1~ zIdEtgd{dG`=X!z|7_cBx6B(&e#MtlBdj+;C!LsyTN62J%8&A>51_X55=lAUqr~&&R%@ zeK)3f+|HxyqXWnqZIgZ_Eo6|NMh{N@w}+3d;ucs)Y!Tw6)4fvVV&!AMN1j%>Ohz9G z`52>UyLc!~+>|g-FtrIIZ80O$^ke)fKK6joPdtCJ)voYb&$mJD;A@BL9geYYfiLR+ zTs)FxU9L5M%zVgZOnc!3EK$1cHH~zV}~(_9Otd3ckIw3>M~> zU{JZ6qlcpR)n;Brh+KAT>wTXb8LPP2G-wo!ucR>9ZRqbnO`iGD$YAaz>C+d%r7P9d zW<6E$eP`kzRB%fkIj9xEds=rOdj7FVB%kDe#cr!&XaBw4z1Il$!kgK6jM%{*4*k!$ z^fAW3$M=0mB5QrIkVkWE>(~29`O2{$pskoA@%&c@V)R9}7udV7Iq(JUkDd&gRg+r> z{`)0b>;cgXYx(57XA$C#5}a5>&2Eu6*AOYH=+`pP+Nqg{L(xIPjI7ls#VK14rOaYA z5FPh{aHSuBxy6lw22Zrh|GKo73~&Smx$>odo2VD{{Vsj?KgR!cfEZ{MmHt0lU$dut z2*kk7QXE>%w&fc@E6hDRl3b<#VAg~={YKjDy=y=}zn@$6-~YX_9a}x!*pAKjtdCV+VG<{#m=-1`PsNT1-oCmx z{{Bn!v>_VI5%?L#2xYHF+DaXQ*h+{S{Y=?2;ja%I0mmP@B%EdLv^zshT}Zui*P^{d z!0EQ3kh=fk+_*=Yp?RSLF-$p*z3%qn!cRTeZ62GHcVt``?_h$|Jv9(*TBZc{z>}ur zzd;wzE$wxNvpvJ?wP6ygstfLCW?zecX`lonm_&v~nM9mcUfkO5`7&>Q)t;Khs2-_y zFtj&@ZKgq+=H6x?vC=VMLI!7#_$y21f3s8UBH*;8hg5z|>g&IGX1)0-1757vbquTg zkg$<+`hcbO&1mTNXcaD_=I^QGup4KjgPL$*@p7^M%{jAefTZ!*OP%qIVZXT#SBe2iLX%XLf9=)TI7A_0K^4`!9PZ&jt?o&iw5>=P?CX zj|kBLKHPtK_hv-cT<3pTUN$yE-Lap#qpnA;>A#KN(rHHS`=bq`=@Tv6U57+z2Py&uhyKClcV$)sOxhi`dERhF1>1aOrCE-2r~S0 z)=<)OMB%7KCkt3xkzxK7>&HEoCnqS80gF2<#%#<3>8y;5qz69WqjANaCnm%smZf)O zK(7WtoiD@p2X9>C$8_Jx@bD0kD=qYvH?A{(1HcDS&%iizLqBV^2_zYZ-VH10N9vs6 z-CD!ov&g;{79$`NGV{H6fX(%vM`c^EL-kJ-ed(M_`4V583gKm}9g(^(&;D4@GvHF` z18UfVpBbmaN(493pJd=D1Q+%71%QePW!fbE9J zqG-Iqi5Cvi#uiU~TR%ytL`Qc}tL|I{r#*0U^9A>Mu=mZ-U%YTF*@xdwhn;#SWFs8*{MH5RK4F#lV6sq3nmsqik$yOOf%(is_-!p;V{ULO&h zqrAx>Q!9rwqZjGrbNHHsVW)DpM!$OXLt|_|9b$QFO5plEB8}rJ!g~jBOzAh6LKXoh zj^H0}IU%H;U%8%`5wY~gg)mTO0J(Q9pJ+s7CQMcCcfCR3@yW<|b!~5m%9tp-5Wmi! zoJrN%kjU$6-wy@8JF1`ZMP}3+zD?E>ZM+zv98~k%f?#1Pt@TIikL5EkYOm!`h3!;L zj*OZWWhe4PPM)ZG{JkY_lkFmxtY5~O<>Z6=tG%7L2nFT3us+xGNgUhw`xmTZQU`k8 zR{uQCu>-x7ZtNbJE6z5m%uIxLCF#W6pNX+gC|hfh!N{3WXW|f-!fKv#fMbh)bUh;j zHSY0=j+gAIw&KoqDJOWHNJurppg|_4!lhoMhJM>gGyS zWtl^>Fqz=;0X-XnHwJ_2PX3jz2pkm?R`y-|qS6nsDBjEtCw8jMCTZPU6&uf8;Ii7C z8OrFlb#ht`m~*gD*^y4!_d4JQ%V`Nm&MBuam(RAxmD)6axfytPo4wAZbw@Xa9Q<;f zX>PWm144=A*`ukn*_|Ya*tgT%Ib;+)1Ya@3M<`WlB=Q}>8^bu0?+U8G2vqxy79RC-yP%TUG?JE=%6b1U@|OPW~l zLQ;}x%DCS5)lhwX$S^=6{$99!_|c=G zPSb;I^b0IrY8rHR{)?Xcc3&=PlM;!p$j{H$D?S6BiaM7%Jtch)3))mq=gvP}&8`P{ zi`2#tElU4MiQ#7oy^pQXO%juM-yT{e*8?942vKcgqaDDr`@R9#tuNi(&(3@|NO>At z8glM)Cu+WdxWd$(e*I=NoXTk67qfj5jlStbq^=%6hhML?nkjf9p{?h!o(5%BN6%b< z!RUV)O!#$11Krn+4I}k3G8XVkSXYbeH1i{{KF^VV$XY8HYP`x+(pLPD0_+3aM91L!HocHC9rqDB+<%eMuGs zwGeBc;O{vc1ez6>#2fX0^o}N|qQ;viFBlBvxxmM@rFc1v;Un&|E2tFmZ6%W{?!9x{ zx?+m+{~YFx3-S}0Z5|zWCBG5^rgp==;E$Sw`RD_Le77SKrTk)QE;@RqU@c5o({FkK zCZnuRP8P+WB^M#Q?;Avj9X8z~MA*sOc1;RlIqU~+5|BOf#)*@rl$r=@b%QkfkJ`!U zHW{A^A3V0~DFPQM|I%ssc}jz+?k)YY8w&j0#_a`d=JEs$iyEW_ba7%`r4v!`sof5T zfQv)$yh0ZjtqD<;ipH>T?W7#np7aDO6iL{;q5_{j?>PiX%2!ViWuqD~Aut$B=F%k; za~(?)ok8)G<&aq~NbG^&wiz2sTv>21Im3HO1@+=Wd_+{V=0>NVxbK)H3}z~i-ldY5 z6Pctfl%9u&w1}9pZ_%!Il!vG%LS#9i4oqhW``L=!c zd{irDmqInO^xI6S*>p{`v}PXH#Ue-R3ui>Gx~@JW7C4o_12(4x#s9423aezv$n&Z) zgN$Z6ppT4-?Xf;uDjUN1%>bCPyy~PkD{M%7^_t)4_^i2W^WwF2cAnFY#8=3^Xi3O* zG)V)Ukv-Z!jT>P(NsDN*l4y|Y+eL1ZQn$}`_4h~jWtwPGR|5?-sSi+Gm9z3Pxqlcf znc>gQV44{e9=wKK^$}D5)pL_l2K`EviB&GmT%Eh~Jf;2p#`N6ZE0|mdoSd5e;jZw% zPi8GV`$9A|{imb}NT(8*27N_}=}%Z8PGr|h$}tbK@2~cNR4mpRb)JGgf21Vzq0x+x zgCeIliu-K6p^G$9NEmQXpm?McBJOkl!q-0CMp)mOi%Xw z6{QmME?I`znFd*zF2w#9xtT8ND@mrorYBUC7mXg zTevsH@l224fc+1Eu0;w|W zi$8k-SZEV4k@1?BQNRv3;!Z2)TX6aioDz;q#|6UVaE zi4&PuRd&7R7s891!K#s+rZ`oUf02nJjm-5hQg%7cSBP|vshCE{7IqQ=y!M1tlUWLDK^zH);Wo!D@hmg zTaMWAYA>86kXSmqX47TnF1tA8L|5t0FV$!M1Y7L@Rru23?{*zZ?KTA(QQ+=cs=vz& zZX7a6m~1*0fy;sJtU|$)hL{!*Xtr@5-n#3-qn@-S5td}vJr69NIAc*IBlXb!H?eSH z)oOF(4qRx*x&0?DXFV~}+-p=vu&=LQy=0Ph<|W+0-GY|7!nA1{aEq9f4s$%XABx}X zh_s+J-@g!lzXTY@9wpJns~>OZd3-(2ftvJ#Ztr-ZjJxF@B92^znI0QGVdQ_`0ku7IyJB_c}h0I!b$3U4qdfa)lqNrXh zi!$&ny(g|z#W(P}5*YvK*`B}T?L@vNXzovpM@QD*W7wCII78=)bYfGV zrbe|+YbEB{#&9DylN%#gT@aMuG2M!iBLS6+{E&~3wuIGA{g9)g^2RzQ+K=rN_^*1{ zS-^J}eb&)iABYtW$JfRqCfnlCQ&z0)t&Jxhv2jAvkrAo3g->b~?zcL_T{Nj%d@M#} zJ+LBFg2U5-?q93Rv-b&z!(A+_3Y&N2#Zhrnj#m1lZfX6Y<2UP~lPr>SlC@o*{;{D}t!gBsrX)(*4uoBdE zrmtYIZ4+BQ{@Fg-f1Mo)otT?ciyrh*twWssE!}c}wdHg{E|YeytEp{pos+An;b;wv z->t_Becg7U&HO?#c?Sb}Q5WE5Uft7XCsSMc13z?B=E)^|)V4>I&Mt}Sg!aWpPrrl;kI50d}OT{60i{V;iN@C{WhLC$TP+D@Y@nm z7|Lw!+_UwlIqg0h#XGeekE2tB8$d_lYVwNz2v987L6kWY#)B%VG8iq&9W>bt&-Gsp z#Kik;3J4A};)Q`t)jA&Ixj-iEHot^4jN@D!o^11=sl>-wzcfCFYA3TQXb=K=BaFw~ z7lcvFYAJC)Rg*{E4@j=VN2L5gtSM*g<6U`%+vhDAOrw-%Eh5FMCX#fl=-pCrB`UXH z4<;9RP{^Fn#T@_wd8pq=pQ&ZhoD83jG7T8T+h;n~lm-fX(H7$15%{v92W| zw=N`07*avM-!?<8RMN!U>W-s#$yT(%S5crt9K*F#mjrZI?}_G!Npqj+sGc-Kl3w!| zQ)jnX3hUpcBRE)6`LZj?qvKkdDxFz5j_>UpaW#U+wS`;Fr;tob)yPgK&}FQAumUIT zefh)AEcrAcn3!*`J5>TYi^| zF3ofG(V1phnib~Y;I}N+VgxaC0ro?{fctN@w`Z1?7?-N4pw{hJ9|-2O!J$9pF9IxJ zUwxL+ss^TE!yA=YFq#*Ea6nnZm%!x+;1(ucL~#MXJ_W`Sz=%je^VxC||= zh|HOWcSBcc>ng+NgQVr;{GJcuMlG2ePu8ZzzgRsd@5EB=tx$zY1qFFEAW85r3UHi$ z2YzAJ$Z9KtRZrHW+injL`rso8^lm~GtfKhc@vUt+FW`w}`oX#l%v!ppvo;|tl9%J; zGA_2R*0AaUW0~zQ>Mw7S7SK|L<+L+-`$ikd!T(+jjm&9C$FFuz^gfXGq>Xq%H+zk| z0A}ll#(@N3$3iX9A%_=Z;Wfg(Qbo^QpJ_KMuxb8zGm!e|$S?G}yl2&K`!Y?j$o?m} zRXYn=PYS8;KPaQQ|^+gYXJ)lwb5lnBlxN7pUM04x2A%{eR;rF5!0lOLP`bhXP z2Eix+GdUn>m-oM6RWN3T;00W@G}M}K%wVQ4%lCy8gtXF?=jdSsAKqOHCtb9Bt}3!k za&qc-{y-=iB2{e*G83LKRxkuY3Bu(LiTN2>PCU+Wsbs4^b$Es8 zjkOYUpDcCBaX|L>ofq@*eUC?w=vWK3xwI=1shpGm3CG~AcwX$u7x}!Mp4z8-X;(ne zJ!fgvXf=qJ1Y{rdR;~B~j=7MT+Yv7_$*kK`cOd(@!(JSrP`-TmyWWXko%jF&Bc=UT zRF_G3RyzXq_0D-l?|TiVdHL1R?pc_|ZyIAe0(1wmvOFM~ylY;31ruP{~xu{#XY=qkpz-YC|O94W|3@39A?*pD7o z$+9Zkm=?4#+ox#yxG+gN7ZOmG_Xv%r>m0=8AVvxaR{O1q{htzRL3R&=g>Z{scHfxmkB+ABU5K+YfZeKow)z!IzbDNfEy`V? zs8dgFdiHeG^RP~gng#RIwb6GzP97yN_@*vq8+Iy!e6_d#<7veXx5Wo{uJ#tmuIKBD zU7z^_QY^~fV>%CIiK7)hwYB?+ zp2vJujYuZ@`uRVR(1EE#9p;FQ9YqwBBk~Yb&uI{M2T$xQ5SsbY~5)sS%IY6 zp(iB71d|?yKG!myrYle7u8}siIPnR!E285b=B5G@Qcxy^ntDN^F27NXjJ@$-Pq9N) zM-lLEw9gX${mXOc@x>o3@FUl1)Rg}&3alP0a_A8f7AErEP&)i zPK?zmj%E>{BdD#1jR8x-BtuXDb&`iXV{)k!HJRxit*tZ7)_Mh5`#XEo?rF3?!fRM^t?|2q#>i_7Xr6k+ z9E>BkL>^%0&ac$lcp&Y+YhN|&;J|t@dW8?}*81hifvBiJB^b}a{aT@(YREP>E<@FM zrADN>MpV*yB44`AqaIH*HE6QZ1|t8=_R2-b#OK^5q^Q)_X6cN@k)IB0+%Q<5-*&RE z?{=yGx)TU3T3T#=zS%g$M!$$>xB2RIQ=GPT;`Wh;7waBK96SCZo)^K9PZ{A* zk&Z8aw1d9D;TFTot(A51MIkTJGTBj=1KM(iUy_W}KMb^OE}hR9&@5wY{0%7WtVb{; zWHV^3^>R|z++N_f=h8z&UkyZ}8IutIaW3`BmQmP(3o@<9*(~DvYAv@`D8|a4$!BUc z+S?17cs#CwA?Ibmg58a+KpO(d`DVi{+`REZyFe>W_9Vwa)J`CxvSJFKVr!e7-EPIi zue3oYUJ^^_%PRBiLgtOTI~eHtI1S4hm|$-=mlq0`JONVAey5yrWiNoXe# zP5H~9ySBU2>yeMXt%Y?b*1kI?dLk!FWDIKC=)uuQMbErqOkK0ANPf9)JWi#qL4BG9 z#Fv}8nsN*2ovvMx#f_@UC&putx!qYiWPI`X#4Ptkzb|=39;ukX(vcgr1bR z7p(du)TtsPg2v^R#ak<2`&#hGg@B_V%nm18G~m#5BFQAjd_FR0K(BL3wPSU>7VEo^ zj@@0f2i=pUrn#1KK?9S9rCg`EQ7@nM57$-{p|2fYE3;3ypYp|BAvwu8bEx3OV0W+- z)@2abfoABhx%}81u9c*rl4(?-EP1M@12^`C);O6xe#f)5fjhTy?GdG?EQgQdV9z}0 zI&mG@{lH4ja9^lthtijV?d6>v9G2C~YYlq^wXW~hO{8HT`!{VJ5wxPd;j!?jgcH+^ zslcjN&?AT?&O^VPp8Clvx~=s}+zL_YCG1=~A8h)xf;nn1#HjeVGvtT}4Lo{xc&Ald zYG{b_NM_hs@wj#y+vPw(^y5;ysM6EvuG0KRgE4Xe(=k$l!tb6Fx1YVqxK!X-qZBOj zHgODBoT;8eqYL+}oxPb4j=VIUt&L1JL%W2HiiA`k=K1Gw`iFe z6S;pOC)_N&n8zD|BzdYKTEE!+-)%z*7ux{z&!_ zfUYtX|6Ql>@TL5hi@Sn9m@8@Gm~BQ*rsGiF@nn#J@^h-d5pDRRE6Jwn&z@Kw4ubG= zTKI3X;~8kuD|13YR?Ew&POn|fcmoHVi=aRfKm?7;eEZ^{Tm9jCepR0+EM*u^&5lE( zc6D=mmD&-~|0bhY&qKtEpN%)i+;2d}m!r_FsoZ1)vx607YHYbZ9+~!NNkE|B)HuFV zbF;aV^o-c?dfx%)tC86%pUGLS^pg=77He7z=F@|i~um0%U%0HXOiGqaBJ z)iuB6D(g)m0(sDipI8v#N4hJO;O<*djQsoe4TQN;=G>1cz4>e3UsNk4XALVj@d)BE zc1Xf<&0WOA7qe+pA;Zk$)fFTy@ch2vH;C^mqW&j1T{nVPf6PiPoOi4MX8y@4e^)SRBCc4??N_y{4iCfI|jj!nK zo)rNYvRnWl=*bxiBVMDgKwgOTU`pzThXa9d+bOroA85}b)~Db9fR7iWwx~Q+gF_42 z){a-dmQ8x$!9>Qu!`z?sPb*pbSy%GD7<9_5SRKY2UPnH3^5|jL^o5^2&f1lO8lE3A zCx~A4uT#OZ3fJYUertRNxV$I0Z$90ZtTgRGV!=*8(k&lY0n|-XE6v5wUt_y(p{}8YhOU|XYVL)gD3IMd-rDcf!T5^OnYdR8d<=yQ7r)+(5Pz32; z3}R%fUKxRpYPD6iz^Vnz&`=xXTWJQJc8WL`bN7zsR*c*x{l$jjKi9e5Dod0{&nt8@ zb9Z$HgQIs44WR4SiEj7qwYpTUCqU5DAyX^gy}huE46ko4uIz3RB1|854RyPBj(BZ2 z)wAVU)d^WrnEcM0%nI4MqY|lp)vrJCCRbkgT&O;z;=JrxG52(-|2X8-tmK7n9GCma zjIl=k!@dvS-2qz*THPA=P2npMeDHF8;X;WY_E)8LSh!{AxIUuYQTGgBCKt)ZD|41x zapX%mt|EHJL6YV7YF-Z_=D|2Z6c$c3 zi1X(BKpmcW^fK}OC4WtP)UT`lP{@rEm!raadOLB~LBpRqig_V{p z?6Y3|Cy`sRF<}p-j5}X2n)B}J`kt5UTP>qfIWL2aQ=ZL}sD0OHW`_5l1V)s(K-ROO zt_y~#bmww-&otL(jt-p&uYdY<7=l_d(-rgZ2MKS*wr)vr$+6Q{rv}l`c?e?!F{Wv+^kG2&Rd}i*~PZg0uX%BTDcYL5%a3??9y8EoqO`M zrMN0aDOywP=pn_JHdX*#7h~bGi7Q6Tx|e}KP*ly<_tK!HrDc9)K1Bsee=|9dk)g?K z3PiKk<4yhNYLUg4 zNE0fSekrLq$3+P~yY?9S*wmO-?o$e54G^^5QY;Mj{PF1Z2u(23iyHShu)phE;wS9C z2}yNXz83|8E~jL)dt2R3%^f<^&*8?3h~bSj9Z_ieaPjE6`564AkT7yD;M5T7W zzkSLNc2;;vV=DR7%0CSrI9vA=@+Z$C^jyVoND(iOkM-qlQKHVbeIPanTo5gZZ(=1dkzod6eQ2~NrNAIFt=XJTD`0>^O*C$jtd*B8r2uf6(&I1kzK|16uQ znxS_mS4h1>-HRb$<0607!?2_|-0=04lCu7R2VRpHP2?;|tVnL~z(g9pY_djC&;{W< z*PT@zcQUcRub;u}w?fU%V2c{~q8$?acVZ%zY_80MyH3_;9E~og^AymMGI9d^`ijMI z8<^5vx4Nb-iZ?m*b8#cXkh(&I@X_~KKdLD((Po+9I#-<9#`s<9o z6PPuZHQQN3np!cxTCtx0`y}zcWb6B_hH$Lv6X}{O?Z%g$JTfscHS$;rfe`a7O=`B5 zE+H7*X&+y^jZ2zdFuHq=SC!FZt*pNsDCr3MT6PE z0Ex1P9G_Qn)~skVH`*wg(cTh4=~|3i(zx`2djkScnw`lvAJS1@DIU~PAl{`_Jx8kY zQK;RDH|dggrC`>}wS>f$53-)kq{52420qLB!|wqMv4|1iv*&Qb^41#HD~sr~>6gfv zL$1`2-;@eUkIrk~2|X9AdM{KaXkaW@Ioij|kkL)kcuB}%t9<+#=T?i8k$>u08&0~$ z{AC2HxHry>NnNa9Ostd2=HE@{;xDCL^L~Fg-NvsXMY8K8E!Px2_*;V5JzN2##g^$@ z=KDypUpf~`OimUCrrVZZ>Uc@45GqxfjA4~vhq}W1nT;56nws)Z zbl=HH;WwUFfvZz?z^i>7Ke>w*Edrj zteIIA==xN0*d=xIEsvW$^PWz6*JBKtFP&gh{lp(4ECT6ymW?4O7=<1Q%St=-Jkv}D zuH*mM8E^dVsLgI1Hto~8))6;|VPgG<3t8*F_byZ(>=3fdan}<$T^44CJh~{t$ zA&mMOrWh?6Z0e3X`qb3jvhP&)2jNzX=T5c?1`@DcFaI#`foc{RM}GC=qfg;keMNhu zr~k$Z%IiJ<)_-^tBL3f|N}sU&Lc_g#)7qSf3py3BRO1asO~w5XAmoW77b&&6A6x7c zWuhyoJKY#A(!$!)+aHBAXnE&AQ6x3}sfEQRa9Qa?1?jD=M-Jb*eddfg;nj~KQgLG1 z$Q4jFzZN2@={e`B11nXzT0z;#jJuje7Bjr){O@N{HC*(3q#I+^ zX48#oO8z9u8==iF!NN4#FlvGfk|is%_O%uA^&XmLoURB_ZVZ3F3{(H|oO$$vk6RpiW94mUiKU~VL^3svad^D#>)P2}12 z{xcC7KG#`Oo}CuntSf_)HTiyf(C6Vc@>;aJX~M$hxo zeNLpE>%d~X`jO!7_gs~o+!9xhP(EUwY}Z&y$9wDU%2qxjou|6zXdB7{Hl78ck zA&G#ik6fs-A(57<@}T+W@WGXh%3+v|6OgG8&8yjwY0Cwd5byvU8HPg81kH4=i9R6{(QsLWHBHYU=FysWA6wYY~?p7 z24`fqt9hhXTPYgFhN3@dfnR@HQrl2@(`J zj_n!iKi{zX_4nv8GMyQH;4kVfnL|a@uk=OIGb`r{a#F`R+-eE<2c#=?nA$p|Dm0o?&xC;Z`YuY-Ze&qY~DEYcU~L- z&5Ip}fZlu&0x@KNoB!B>u!0nkqxYnCv9#q&*=2S|%eguJJ3v%mUHUu2y1*IdkgE zB+jeqi$*}g1OC1__e!Ah9+ zlGE#u1Pl-i)~W=?hGKuaZfx57Q(4cl9Ag)_PYP%~F0oMMUTX~IO#G8$#K2Y1?#MXX zm%ibTog4^;ydufflP`|O)W>Bz#O9ErZ5^ZSVp4|%-X%7rk!PLuvx$rydw0MSBAhEI zZXXa~ZI%j;NiF3b@#-}=*6x0U)s!P00r$d6^?k;4ZGQVJehcO;$eEjeu21Vi_fW~m zzDdB!xKr@UULxu-_tgxTyc42})3cvn zw&gF~zpx~3hl>}P!Y4UCRXBAbC(a;^!T!qX4~t)Ca8h_o_0@PEavZm|_-oaaWiAnK zAb2d3StwZ2J}bTkd$My1860P@w8n)=*V90*9JilXK4tPGl+fMXW!Bb2O zWiDRNE)Wi}Be-Ras-%~$zhSggcGixECP~NK$MGJLM%{@FL9&`q^lbc``_3%lk+|9D z^t9LDb@Ty-!RbNgnRqNW2(ec_9#+KYU*L_M(rYp(ns>|b9Y{cRM zbt`fxP(Z~~lnJx!A)K-!*H8&_gk}k_JE6iR1X%c0&97Q^b7@6my z393$S6xz4Ner<2*xbH=BGrJVEfwwdvl z|CALi*NR?(UKmp~_fvkxX(95z%aSB`oQO-?*)! zeW#JKPc9hzE3Za>3#uZT^tP|Ll?6c_huBn`M6a{IY;?2hRA>C)l8@1_XO2nSf)jIc zh6<*FXIIK+4U7ATuY7N82+q;}WjO#aqsOjIbMs>%pw5(p{C1jkN#47#KJ_em+(S!C zH*j7~8FmNvn_Y!(*>_#6{(U*b+;cuE1bFw=^D53(&bGW;v{lnUh1a_Y{;IYY>2pS7?P?{A}Njef#kmK%0@aSL_0g%Y?N z75u#}kIVX`IUCY|-zY`^^O@~}>?f48LY0?<7rrRFc}?%^IB8N&ue{D)?v_1@t{=Z+ z6A6Ev;p-DMF@q&VyN%3b(Xp6O*&?U4OULUdQa>s*mad*3N&TqqL9IxR^t1BlA9)bx z@29uEkS*s_QZH--SS9Y*)Nm1HJ5b&I-?^Y6z`P8L}S}rN0g51Up0U@Dgjl^IYD(0ABT~$)lMDz$82!=pRuY^{{Ve@ z1I}1~*aGKB9-OsU#Q1GVJyZ#xN%dt@L0uf5u!Y4_m;}1V%adC7e_Xe9`uYUpYLw$g zA7M#PseAj~z6J(yONo@?>J7@5xmh$(iJ<3AGZ;aOSAD`xj-b5VfCE>t1Q1}%F2|g0n+g zPVQajPi6_f9j}18FCMxz^@sA6Q!hdonxE0^+|eAxSdOG^LtJlV56=pdA0dy>>TR9U z46sjr=k8-$#J`%Q{ki|C&?e%CTypP~1;+n~GRfxjC}kI?G$Tg<|J^& zhT_=rg%`|h-G9n5zs3AudRY+KV{&X~)DUS`Z01}O zTf*+OUI|PD^Kr?JWc$uIR;|_WjB@p|jQ7ec-zbX)g;-TRr&Ak@yZ12j;H>)EV^Exi z1AN3BB(`>K3A2z~^3HQzk;1YJ$*7KD^okXz2F$@Mo~|E*E_AZIom+b6+lj)vii-cY zkW^jBn*;0tWOh79aE)BMKCblRlB#l_GQfOxq%?PJS?}8-WbZ&^z?O~@GS@*cT6%!V zX7T&=pY60#|D6vi-^4!LtVm4Ex_m{OoAcoK&$Ot4k`e4J z4<(Z%Fr-%*!P)kS%8|!Avp$#v9%k#7#C~3sCb0+?J6a$`?^6}IaWhJFvLNS~)dPYy!h8~*0LsmCn zsa=wW6BE=~O?c)yWxjAmNkw_b7BcAEuW+>IidkG-qz1DN%Ce^Xq44d7JdW-g7J)^q5rzL8u{%d~sqgMos!cetG{>qgd`Af7AaT*SF@=fxOtZMMID&%F*btnKu} zg7WU`^%UvMTK+p}csnV-)HIth2NOimQibp7wIXXz`8DNzHBj$?q%r>XVgD@D5_6lFN#T;_0H0gsbO<}K<^odAqkVn?*Vv0y?ojy52gZbO~@VYo8a| zovlQdF_TUG$GQulyA&SH?SWc=qQBdDH))_cz6Z!)r+gUi(;`Ha)nc4^4hP~H6q+W3 zxo%QL8CpGF+y29&BN%fqu)0wYy4C4t`{EZ`eL4zbS+Uy>%|g-JM}-3Ru^r=NpV)`v z!aI(I@mPA)vqPU+nTo%^4Pe}WNf|7C%y!l?p#G2wdbR;*Z4b0B#P8q)Vfp1q!_}4k zjrD&Fhn0U>(kRTbAZX0j!U$A(1Z7g_}WnpCspe3l= z8llR^<4TNDyLr~H4J#IdjuiJ{2?!=o(jzT4>n6};Ij0n!-B1$hQ;LyG`rXnK30Zc3 z%-YRHKd#J}%v+9U3Y1i2RZK|XcLMG@I3&qgK7GopOJ?m%>E>2U)F^5K&I}aUwVwFY zQnvy7j@-4^%O7ADfo?I(@)K&g#c3n4Tiy3y;6owt8IhipS;k z;!Vjq6`Z8X$t#MHn#%!BrS-Na>|o?^T~TuGR4a=X55TLO3zWQJIUnnW2($kHR{sMp zwVM6E@=^;1PTW&hrCa9h6UtLAuLH*g5F_k$+gPm5c7MYXaKxn1?jl=1DzIg}o!Yxw zo7h~JVuEq8CVpe7=0>hl4&50(Y>{7;lhIs3HL_Y<<5vk-k%H;Z0PvRd*vzl#&k?QA zNDJ0>tcfnlRzLjsr+JJu&uR2@h~}%V6w?I1>Xe%+6^ZVD|4utO0aAAmr{UGHjoFwD zKfoq3aBS;95o>>|%q13WNa)GO2N-|QB7;iTsqURuvOxWW^4=d)*Ov9pCoDhL<-qNz{qRFGPL8la4A7E;6R!t8ormKI7 z`1$PGBYwj@OtUhHI1O4#Za}7Y`~M1>S@@U9#(!7nBF@SI)DI9}j{n9IgQo>$uloeR z>2bo~*oHevu13rvb})s&H?8Z1z7g1%!unQ#0?L+Ix_Mcaxg9jfFC z<4Z6T6Xw)p2s09SePZDoKkYg2iTAKlHR9rN(e1D$r1}>WlSEewUU_gP1Yx! zM~lXn)e+?@3FYDytOVz)GJc-A$-&A8-`-^1He#WJfWu5Uu*f!2sgfv8P+bm?iV*X- zBaact*;=#Ltjc!Oqg=@xHFsP0VnT#INPd0KXK+nUcDqgBAeGD>1TiGJf;*v*@jn zT)+AAqb=OEN**exd84?iIiQGK0>`?|Y>%$WZp)S|)xF5q702NLSDn|1saQ1!itn2n zO(pUB4zO?j>Dje!U)T10m@$mYZQNd zbD$Pw^%|h3ju|HbBbH-EU+jq#Y%rl`K7?&1vM*Osd#sKg*82R?duFi=0@+4j@(nBD zZ_$UC09%Q8;<_j{^cq0T9vH^TlVU63Pb8lD+S2m&sBcng(Qw3QMK!{IEb@Jaog%Wh zulDxGBCrj@m(rIaji&*F3O&hEUlfg67vPJvv-7}MxDJ6*yr%^ywkG(^H1nXQ_#)tY zm2fY{GQs1R`dQvyVKOU*GYY7YuK!5M7JsPRiF;B6?lkG}LhNkk3)j&}n16{BL?^|{L-MMX+jkabDL<6iC# z^?}xuRSk4iVToNFX`<_3e$q z2A$a2PT3m7Vo`~q>iSMLGsc8a%|&*%A%sharR}!N=<$s1&dtq{Ou5Hsh~5X*)&4d zkrZj{LXNoo0F5kTbJmfaHdi#3u#D#;NOhf8i~wcF-noa?$C_;m6ARWt#QzXF{p2it z{ue^dBRaz|`g$pa_OUSA(TSqzWnP+CV%PTFEy5bGp8L7k^6-9X4h}izc)HPlmN2!q zBN$_SgiB%FqoZOUqGW*&`@h(GtAHxMt#1@X5d}nP1VltSr51{SfOHB-r*tj4W04C< z=?-aW3F(rQZjdgCMR&)Uz<-~;&;H)`>fC-e-pI3_XU;jsZ~R8gF$9;@j@u^8FIp9O zmkmbaqx1+oa`NMA@jj6Ft^|j>XKqY@y6)g-+zKCuI$T~=!-!_53Xhx2>Ywpg?LQw! z(t9s#zTC*dC1q42ZKuNq*O}1gP<3fs;0)#^ldaf&9#Eg2X#_I9FXu!ozmY|EFYR&F zY&d-0sb{QTHHM-8`7uWhVjK%qpFuhjq|<^sdACF7$l(%+9CA-nQ?1@}#4A^yZYXNH z{n8u;r2=<_-hYhvk0Q3nAP#>B+gOqaMR;7MqQc{CmS?LxfF+%;M{$9xnWeS0Q*7O$ zzEX*-=9hxe>b9VG#K9HOc`@@4MDRN9*tu^u?o<&yCT43sEC?4!**-`{$j7{hC#3b) zi}fq3&}*MZE0oo038tuF$9(o~2zCFcZ@u0H%m(^o<_Iou^;WO!Cd6`qkjPfWh9a62 zr%~TGGQSV0DJh$w4;I-T6&CBb7a$6rWXpH-mQe@C94DJkl(8p@b`A!rOS~Z9wD@7V z_KiB$##nV&fvl=0T^>hoElQHbbdIy%P*hntwtP@`nWnR>hA?*b>4_9!aCo~e&ZkZ5 zdaU#<$}u3tH8!ctL#Jz+mtDRyuuGi)Qa0;KL$)Z9(w{A=g_WD9odu^qMh*V#J5vhQ zTB7WRCVow=N&%OW3fq7D>EEijBAQ+A$Jk!jxeV>i?OJCU@2GYy>V#}m`$|>KkXaH_ z_2Zcb*q?@fX}bs>yEN*iW2$|@Dvpr`gnIQWtSZ&YeXRnNT@6Ha6G6C54x-w zf0%JSLFc|`Cf8@o+7fZv-wdJFh=r&A)_A-c%$t)Mp&0R)gu`Yf#KH&PkU6knKru?q zVaX2yJGFZ1JfDQ0HWx@OeOc^X?(vQ6IERlOl`nKGwe5#QZYUP#8ssYR*DQ?$g-& z0ZUyC_<7yYhXRXrmjN+t?Y0bGHY8%s!}n>4{83YYwY#1AwfF`mTkPnO9`~`2PLw5z z>Gi%nYOLO>knB+yD*eF0>ew;#G))MYT-n-e5uXp$AZCR@$nh?^TP14o!4xjVjPn4@ zpXafMvo>;Bho4Mk-YP~lEd$-CO?UC%xsRD9;If(m7Aiq|dcyIGLt?>?t82zRZx%VX zHd=UnTLLf7i+C zjo}7P2Z;Yw&F=`4(#i{hD|rSi2oX-K|0r1dNFbP<awQg@h^XhNKeJVF_AtdpwjzY~($3|~aVPf0KLFsn`Gf&BYc6HsccHiuoDFelF zl9ZGc!3+PYmJ^6Rf97FIxmFdNY+q!&xGO~-TO)03Ql>Y6u;8p26tHH-QClO4y9iIk zzdBn7xGNFM(PTR%?RE$U#!cT^S$*)*aZ3}71gsj5Go{3Sk|`$ic)GlNWQG!E~_A3NFqH-bLDwGy#zc94rw-vJn29#0q=WVm(!b z!U+R|q$?BsSISZGuR3#*A&&P2Rl0jNjqUB~&Ya!qBXdV<4_0m7=11(+UY%^MBA?YC zOT+M)7%SJlZi;7MwX{HEXVB`eHj>@uS%Vjv1H^ewmtiNd(k?>`Ng%aX#glmaC;3W` z`AMl&B`E8T)^I3WmJ2A^a6cpb?f=PS+GcnHl&genG>}e`7=kKQ`!v(tzl5v?8#C2y zn%yg$JuP$!u^#SXubM-4g=I%cxSZgf#}7bR?Ysf$c{uN&t-2VY{|7L|z1U!xW6P{< zi+4YicN9ZluY*(5^~6VgqTIpc#gq?0(19&inOWt0w|SA30w3Qm*p=!`upIxF#?*>L zduKU{u!ri9&67T1&tF=vh+P*mman$Yw?Nt;98?uKuEs{&g6M?nE>5{7+XVp<(!v>% zYgPD0w5HQ#-8xld+GoN0!w(KGjvvfyS{KPso5p1>l)aG2)-ATr_g?s<%f>NeK2x{o z4^g)r5hxidwV@ruwpLQuT>i@IvXhZJKCV&#>oq%ZnPv_onc%2D_ce%=y}aAi3a_el zwkuGv)=Mqfi{je6+&QWr{-ZR5Eua*|uD4pcHaZh0@d_oPv*PEg%(3Z_(^j}*VdW+F zhFSiax!aZi?|ILrI#(5hal_@Z!`9q+jca;%dIY4D4tGhDaK#AWqCH4R*v)Sk5-oV8 zEfP9f@ZC1iU{?^>l@F84iRM;CCxaI{ian%?qyT-jC6V~{g6`^MBX|086WqEA3k#zng&kXT^O1evBO`ny5vv-U11ZTwhImAhJz0>E35pZ!8`q-!Gqz3nqkA~CSQKg!c*hy=v;@9Elue;rK zCg4WrOVPa6#BH5klWr0OVPd+F8fL|@D*Sgpc~Y)&Y6VW%0R z_9Hb_`Nj)9aTNHB*2HJXq?d!Bqiyu%l6CS$8`FjJ*sJor!@M!vDs5VdUAyUebH_m> zq!`o(E7Rw!CqT9jgD?v5@Ng-(xUS|vAB0&~QhR(bEqcR{{xB=~IJeu`OA9Wg?poM@uxNx|GVwlvol-6Y0DK)v?=|N%dk&m&Ea2p2l`|T2r|tk#Im(sto-yS zwYfO9yxI|d{s_e@*2bwd&;P9c3LBRG{b~&?=wi$K!eKYU>WZNm30foT#@j>cc0?4s z@F!SKMrr?Gi|21I_CbM4-NMu;?4Z7W!2ykKTt$`iyx;y@^RGHGlEf3QT*H;sn7^cY zu(S9qyUjd5p|t$`RXNyR<#2TU8x1upM8`0RnVDRsl;fd&{SIt-4|Wy1h+jxg%ec9| zejNVws-?O>z22;I4X({tZ!ct9eRwr4y1psDFM2sWXW2kYV1R zbB3OcNn;)r9Id&ITy&WyjaM$nu;CHqkZfblG1VVW_BZ)vN+tI9_q$Dy_TzYPmpUM58FxM2 zPZgyRX}Gq-aC$6=?jT|JRlIwDG$-ZQwRpKxlI*r!qz+5L&?K+k8yIR}9)+(K!;aL%yrRM`m ze0jpkx@~X8(CK_y#*xP0X#j6JP(ipm%s51+B6Me4DK&6$79&G)qw=xSsU!cO4Zq5 zx_J7sz=UL?U3cJGQchZU-yJuZpULGNZBCz1!EDazXRf>ug9bm#%Ow*zTu0X5@P7xB znZ&55qNB|xiciQ%9n90>yQ}Yqh|zQwPtN(3Sy$=dT=o}jDs5c3T+Cb{0tCvC<3@jF zr`29`CSRRhosWF=mI0TYL3$1ipJ4|R6wb@O2_{6{uT+&7OeEQ`*IK2-XtKF_^U0aE ziMggT9+^&g|8ax#)hg&x{ny}8fWOJtp_-j>I&R);+&6dJni3S;(d0R3PVxG5x&A## zGeY)kqW-*sklDO$qd=F|2<2|Bf@aFvW_8p}jhmHVE9EQ;#FJ z6W)4mqmGE4;KMQNr5;ron)HdWw~=CaIJn?q_GLTi)W@H&LhU%m!pR00_TpyXsKiIH zF(4xNwF1_?q7|CkD@&;5b>Mb|L(O)yG>_fBND%CJ^X-a>3T5Ku-!>kLE6nG0e+O_G z^3CEh)yodW)a_>sPt2(Se2!&wGChRz7b`}t(QL&gmBTKlR(P9}uY7wy==4`_URcmZ zTA7+G>Y3P1C8~g1%}sM6oT;t|00Q}iSMgVb?TE5<>$6XBnFWX@nUK3k1VQ3d0|*W^&nS>T!+2GogZ{J?7nOtoh63rBu_ZB1}r!R1}>o#^Qp4;PQO%S$m^-Nu9 z3e+G^B_qE(2F)JoQ&M;oWS#`H*a+bBZ;TfmERfb!XBYi4?;o=MEuA%JmcIdPWMU#o zn|*H)*Z9QvgzAKbQG(_J~qgz`tw3!FJ{K z0@K{y_4|z_4{|YIVI@lQT>iN76Yga?O~y)>ZRfpMsOH`2$CTfgAfNjFo4L!~*#^=@ z?u+TVE6uyFn0)*N%q&_=B(2z6GH~1Le9uhqNLXSJUGQbMWDx8!)S1+6#rIP6PDVn~ zL<|>#<1P|qrk{oT;V2c)-aeCgo__V# zmD*aw1!c#~m*lS?5a+!OpN5kjC_}SrsQ+4Y|Eh-8EnQxn z9!b0fM%3$92!vOb9Rj(S%DP(LyV@p{9NciJ%QBRIlf{#lT(c}zDVcV)+q-pk>^oBr zn}HsYt(~^@v26qe6;3<11!RWP$gqonJ4!~H%u=boj>+tY!vm_O_>y~*GO zXUZP3Wedlye&@2S#iHS(YCB7S59pV~=ErNmbQW@J6|oLW;aL1#G3;kyxVc#o(ze9Q zD{}%wn$DHkMJY%3Ywq8Ln=RLGFJ7I_CcFGSJQxM%lI1kNEjJms_XGKo6Pl5b>aeqD zUS-@GI41VpYxper>VkDl!f7WgV{<@^A}9ASD-1fAt;KAJ;<;&5zOYYB&Mt{2{BjdX zga*_HB)2EdSu}GiMneTMO(|LX9yBs{i*P20Wu2LFU z;AlfZ(rP6B=6q;&8mNq4sPsvLN77hDPN!)J!XZ!kXVhR>+6|k%Pr#ZKYK4tH7Q6w8 zf7i4bDV^ws$YGbuk{YzB1wX8Kx$Pn+C-4d@meoAPg16xJ)>Lg%x22S|5-+%&%%vZ< zltHJ+^u6WDFYKUT0o<@O>dLN-Iu!xJmI2y_wFK9oR)D~B|gbLo80x5 zQyVzD^ur%vGn-N^bTb;PbN!i!YrT|MO!(Jv%42hD?V`Hi^^%RP9~JB>0%AuziHzhv z_xkDMzN`sHnAz_T(zpk!Hr21?k#l-yl8})oBjh9mw(Hjl-t8xx{GiPku@;31>1-vR z)>r@7^*r@97RmVv+b!&kV?p0|oS|L z6`1CN!HT{Sc;q$ub)nRLv~m*2Rt1Fbai8nqGF$n+gzEFYl#{&j`L62GJ-XV>B3ARg zJm=|J%dL+*dnC?q(jB|INERB$4`OH*2QLq;HPwzra?fH}ZVJti5=dySdod#+5!~H$ zCs#PS?Ok^JfB*O2|GNYKzjmO(;Z+8XZ1BFu&9Asy!YgjYDjYmcC3r}lD(>qNt7vD(!MRQP(NiS&L%wTawJ3;?&D6$| zNGe$h%UEO7Jece(tlvG&JUxZ?ERD;nx+YcJY52fT1KJ58SwPLRGlp!_OqWuJO-82O z7OExXFk|$sO(sSXopUiq>xvvr#9bxhz!Tnleb*n6&~#>GuKYpNv1MJb^J>1Xx+x_@ zPg#tnsjn$ThS6XHlx8*N#+PmU=~uJ=JUNTYZ!wBY07JcQ|L1OP(k-LJ;`%_9UZZv^-dfpjycJ(!bjX&amd6&A@Ab0><^ zoHoaX0#kFrnQ3D^3T?eaUx<(b(Il?>Y9gV;vouplCReX8L>IE5H+AT;NpejsvUgv2 zGbOf*(cpC_bAj1XJs;)|@~bt+D-heikU_U%bnw<4Pk(UR7fFj*f|c2EngXJ+7i=

4jEVSy_FR;~5i5_eS5<%MSK6*&UQPalPZO>y)Iqo%9 z;$}+-5y_8ObX3g!9EFsF90PGa7_UH_>?3N6>|W$`^O}{TYJ;r=UKJTN9@q(Yd7);V z?njo$w*n?`k5-I3gCZHMz9wr)u*D#r5@tWJHMsY#Tah+2EGbJBC>85(j8{Xe7~?xJ zpi|9+^C;@0cQdmiR^xme!5MFPe`~nYKrM75AL!o_QXD$g#{!~USL==*c=0U}MAC|QdHbH7I%WUj*Z@Vfvcn|R!Xq?d_@2g^9}&8Mxv`O}+1_Iq zo_=vgSyq(?G!#kbq389f&aMYgJ_?}fRkLZYEuX5em`;$V%x|BgHdtxGz=>eNApgUS zw&ySzVrWY|kAjqT_g4GxGPR?+YaK3rDr%k`+HR1LfXU;t>LaXZtV48APWhj`JrrE= zUtgnPH+;F>f*zLM;(zNOJd3GGYaT8+!2ul`8yf1fNT;2eeh(IM?d z8fosj`~X_tZ5Y0@eRuM#1G`#!VV?b~XnNu4jAiyJUj*$l5b zn^#-f*ujXYAu=)@Y=Pf+(X99Ec%dR}q}>K#QKJlDU|lkVn1%6R>lEt*{?^h zB~}1@?0*35#g1}}JOqgo|5o>Q9HYYNqVklh4-4W8I+v^#bb#(Hpl}mETC^IeTipbw zOx21pEhy|{a3}Ef!eIvJ-HNord&PPlw(CC@*?9@j+3VLg)=VLl$8j5+aS_}l%+kR` zYO+`m@Mkx>C}E?XPxwfjvRB=ycVjJ@v7jqx%?i$np2hhbVmdQDV$&sNpZ+$k+V~lO z%l+PaP6wcYERvL@nEGIczPiN;uHv+7r)^~d`|GXmJU2RPxw734uWBNZ6fT*%L6QXA z8@-@>OCvbe)k4RpdiINJWCB~KrCE6arQF_2&z2Ia(0uA*pjFZr^SMabkpA_nkZ&J4 zP4#P>ZwDs8YRha5zbi4ZN4Iq*-H*?LSQw0+9YwxV^7H4#aQB4fSViShbA`to4w97L z4c=kL8O3E-GrINurylM<4;oO8VW^#lf7t7Hp)|VI!t5KV(DJmJ;HG8I_}sqQSy*ua zxBvLNuNUBHH@+Xr6mN(YkrP@plYoFTrtzQB2;q~OLc z8OIr2k&>NZyVg@X>}xXfr{-tIKL_5 z3|WDe|4#T>I3Dj)sUvJX~ zby{m*+fD$j;R`6y<(zun_BahcZa}5s1HA!t5{vU;s$O!{*2OQazSwPYhF(j&rH7VH zha{2*zKNzUr^W_wS)M?Uu+eWfTdhOpNitiB)rqrt6|}waYrCXhL-=Vb+|gx%d~LYMn3mTu%wW_DrT}_V37K zP`XUvGS}cNe;L_scn@P40Jij`#dqW6L~%O~QXM=>=DHh%)JpBMaXq|m!fP>_-^r*H zBaxxZ_IlE?DbtLoeBIR8*pO2;5^DYeiquMXs{#>@QF^R&qZ*crQxMJM?nNcG*XNc3 z4QyfA`=L4qz4g07$;vVN;P0_-{yxz9Qq)w`QLrU-G5LI3y{m-yR|Vhbfx8iPMwPyH z60q)HqgLYlA8O^@Se}MsX~NGw6yeK^wabSG;`oY7)CL43O*9c!!EG3AkM-U@Gox#x zm(U`9ac!p>Dkw7wjPyzvE6)Atw(1tE)OwyFNE&J8;mewiI-^OopgUvshz?NXZ16$U zw;yC6`!CDpWuI40VvuhCAS;;2TZZe9_7ey<>NqTcmC7+G8kS8d zIj(k$V`DCX$}tTw@2~lT`%WuU$yb~x`U=C1EZ##f|5Qua5#rQ95JbdbHc_Ex0DRk~ z&>S0Q!1DeAdQFI9lnyr(HAaXflE*6V5^z5Y1MQLF z^odnJBKMC0H)6QpA0ay$)Q&4YlBe!GDml7HzoZ=O`>%sMR3LGh8p z?tA-G{(q4h-_WQ9D5sCCl=NhutYWxnzWutI;%{KC1Ml9hU6DqB&t;&iV{xk%QAL5a zyi6Z3g1*q@XDQHa&1C-0;d^HGj*{>~ziFxo9wk^(@eRpgc8k&1+N}|XRxFW>*6XON zIzMQlY_*?!^4N#Ib5(*80v$WJ#!Il@iOm=dsJF+;NtQvKSme;6m%CNF(OU2@nqZW; zEmW2jo%;#1YBkt`YwBssNM4)O(A*fn1a`ai-IZ?f4~JdAJtv*dPJOKDWMcz``j}rE zXxp`6_${TKNDS;&2?Bf3bc?DB9!4>G)=V0(jp5NcS9ND$--0#rT493r|AIX+cpd*PMnU#JlA3M66W|dsX(HdfZ+X}y9-ZlMbob12_1dx zJA1@6xvi>TiS7(#`R03V_JAFdehN8;34yKZyZxv?Km%B;`*9W39FG`AfjJe~dMdO< z-}OIu7R)xcM*{C8d?aR|b~0k`HhV~9)&?j=qmus(tr773$}vQ;Y4|p7;|3eiALpkN9-{$WYKKpt8 z)0tT5bnhpEn2wiOcJ^du!r|nf5Qix9C=$B2KRz5lDb_)!&!lpRe>6n`u!T}mtMtYj z%p4F79_GF3Aad2$9;m*9jd7!6LgZJI^eQs%^ri)`PaZMfp~fhTDH6E!FWkH}fE6)5 zetsS|`;=zi-~88~!em6lZM1uI=|<0(-RE$`-n1>ib$nS!g32O+>83=zJ-`7g_&iOC z0h7vM_SrNkItmHUvc$V6gphaOQ>qWw&CJcjem-A|y>@I{U*A5{8j{D-`pmM}xid7ndGsgU?q+*x>3IDV}u4CfML3i2FgzjpuasgoNvRK)ub zuHr(7bH)vp!xFpOz=@Ml4|#!ep_LR+PAN!Fy1%}aUGiRYxT37a z$0EZMs;%nIM1xp+heH2{Sb(!VXU51Fn$8hms;SDBo}3MnJr;QFQFKe((q8_j16lix zC3>%ekh7?Vvbk#O13(qd(NHMi>!juQys*t#Zv zyMz4}`rUDJG3Wv2FdO^xHN$stk~ZDIBWzd^z99imDKn_!D}g05;XST9C|gJfVG3c_ zN^QlM19QOgdUUN8qSTqpCT;#C`;3W#h24H3d5vM}zm3`bJ^ie~*t&4a-_MxIz?HQO zeS+&ij9qVI-kaCZ?PNY+2j6SnN`z>pQB+UmG54s3>&Ecf_ym`YI&X^)Cz!Z6Y>%gJ z4_thnxZYO`g{rSCk%fqEpmND9OgMZ(neztEFLU;Fbu z*$ulx-RAWQ`iIkppNKNKFg`r*X9^aB!D>JFFtPia(e(j>K{b@2hm}uT~bcMU6yMC;G36QvaUA3Voe zT~*aLGtuo&Ga`f?DeEiI&I`mXxEq^J=cyeAU6J1VExAYV`evuQv;I0+|5_q0)5F|TSb(|$Q`fi&u|o-4=C>4t_AR?UHHo-;S;52!Ei zK^K~|UI`)?PjzfEjT3))1aTdL=3IE!>3RIOebAtO!~YZLUsh(_cptu9kS2vsfFl_$ z+abXb->#>~sEHNO;#rgm?!Pf}-pDE^6NqyYevynVfp&MG;dM)ANWJb2%ezB>!6sQ^ zmh}Qpnb};58H-A<;mxhQ^o7eB%eH3qsFwZpglN{KvW5=XCUQL^_(|OM(3juZp!-W} zCtG%Z=AC6v08!D<7@;HHDs8d$LC_Z{C4ucJ4Lw6F%YvD?1~8Qo*5hz=9CoBMk4z(k zgq`SOP3k^@Qhr#69pf5cd4G^0k9!!H_D)`UQ?6QEK1 z2lD>P5`ELaXj?YoViJ96t&r=V5+$>$T#pdV0G($d#0(l!W;4|v?4FzhJ_1VF(y!xp z<9`t)P^Tl+J;&-R^+f{Nhk5%l{la&)xjl}l!!B7e$+SFk?@uQt5NPm0NXK#pG7{Ou{5)@S>skxBTU%l+BV zX_9L%gu=UEE#-KqyvAt5e-U55q|)QLwh{WnK=>H;9-Tf)<7-Ks!+R*VE(p~#(@RDl z+SodagH?9(s`dH9;GWA;ea>Maq`>V}KQz3a#CNvvAtl4Fe7DE$w|tCD+VEGA5kQo5 z63O=I$H(cjD{XH&@bWVlVr_vv~ z-^8C^=Tw9!Kjo>G?0O2K^}Ox1ItC!+rNUjL)w6EFw`1t|QYUY23y?jn)HUOIC8c-P za}-7MqOACg(Q!QAG$H6EHY2ISbc}9;?dxqtdnA*5?;{KN+;{g8h-_Q8#X_ zl&8{ey!q~!l?Ykc!TE3lIxc?ZJ10`7tYO>hbT+JaOq1eeMcT6Aam^zmb9|NFUP( zyCgwq2JZgwmt}$o=et^$VnW8D2eLEwj&FbjMC=Yc9b(NUG}>)iEs3X?zv5FSyyj#^ zXO(^HdNM$P&yY<#9+9%vAv^_l-;oxJ?NpYdik75JrnFU%)@u0YH!>m^Tau=#v9e2t z(6bTN(FHW|JfqCWmtUt~$q_G(7t!ZZY3LL*?3SIU6HD@*jyWO;NQoIO?(Na)gOaP} z`Eala+ONTLN zVY>Wo>MPLCrrxp*!&f!wR&~#5wGQr~+!_Ezh{$h)4^@JTVPe!1J>rsITRQa_RQjo) z+j1y_=r~cm&J*z?8ZvKqBgK+OUpoNQWe%4e4`!|ZtdB^y0;~HLc<1UmMbJuDuEl4~ z`XKuuU3P?3*OwEXvNDQ?4(>Vh9q|1xFqnM-wZ-q|sRGGsH3^7rA)JL~_f4poqQ@6DoibE0vWp6`;ps^W-TIL6 zyvoR}n$=yc7a{Gsy(Vvv-9y#6i_DK6s}GXc)^Yv^$74ovhf*j)y^D$AUA@dnK4?NzJxJuOw4C=tE;=LS*l9FE{iX@f`w`yrhQr z0PWFbf(KpJXP-c2qFEr0tzAZP3Jj_V5_&J^W{J2kO`RBcy%j+hCW5qxJ}(wL+{&JU zR20Yzsc!Sur3z14SWwy1Fb^e8;*b36Sq0hZY+b|cCt!dw+AuL;>L!Bvyo{qQl`W-Q8vO!{KBCPa*A=Qr?QT=Nm z>ijf?^4jj{OFdb?vp(_YEc3G{J$dLG5k`{Ou6ce~smK9UF8Mqbml8k(M^Z+%sG{;c z>T&GJLx4`97(1e7LBf*-1_JUXftJ8J=`{7#g`B7Ynh`ft0}BT=Bz=)+N}^9`LsR%6 zmdsh%E<(Cof;{Bj9DiDH8mICSe`Zi3ebB$ZM{IDvZ%i5{tkN6s^5KFR`HI^(&tkGATAPk!-c8BUna|q*@cRK zdGEnS4)yRVu5Oj3Hee2*@m^oWqe-_irJBf&f65CzZZS`W9cGN`OC~!F<3Anfh?9Yx503oyQ)lJV_wnR(1$lAt5@hQk3e*bgPe&B zZsQw+dqiwYtc~q{EAqUqA#Fg7Rh4HE7r+hnQhb4?ln3_|(Lf@ALt`O8W>L9;&jVoMB?A_D@GUMxxk zb_UwC5a=KK*+xOMrS8~TfKqxCEe44`q92hh>J+8bO8l?#hc{Bv|;PM;a?fp{}*s(8I`FNo1QEYc0|^kMTT&jju++a7?+rOIZd z)ZvDJf=L~k_S*z3BuHUnEl7|0=P=%2Bp3p||TT()4y5@14|jmV{HOc9UP)P)Ba#&`~M+GxY5eEjrF)>;wFSj=7`w;NqUvA9cnU4}C2CT8@ZGhLs$ zZFMz<85J5aE1CJ5LO!*JL@))xLTsN);afEk{v z!mERgtCP8_&2i@!IOyI@d>Ii7HXFRS4;w-T*%;zG8C7MK<%uy{{m&0@CVN-BuEV(Q zemzBdpC&XJX$q-h-*uznads>w{h?z&4nJ@aq9B?Y#`cI|6JR06{}t0w>U@FUL-u=n z0q!Czl(`az=l8+1ZOnRhHVOFwes^;9=5A!bQtwk)eHP{VDs9x&XDdfY3E(zvqvwie zrL}SHQ3jW4rLzUgjr^f? z?iy(uL=M%=;S?2AVx`E2uHk^nyz$Q#%I=x#dB0016lCLyEI0?Kpx+Z9ZEQg{lqQL8 zc=}h+mda5ZsTT*_LUz%Hn21&5)DPZ-V374+EGWd6uN6Z>UmGx`B5N|j6DBIsJa-{ycaA2e%ckD<2Fw=v;l60N|4|^yoPnDB8}opX`%Y zWiZaw0bPT$_fiGrCV$~v;JC;P7$*b93ok zp?#Kg5pTclcGxmHlBZPWw747Q@Xk8e5*Z0Im&!u_9>#kJO-5$5IoI!Jt@vB{e+_%T z636$;APE^wev1$*Wv3dC)7dE=$j0qYWnmyL_ra=6S529%Ykj;LsD2HyP4`)WiP45< z5I$AtxCoAX{&&sphy?=z{Q*=8?sfkqj#%cPH1|eNqgpL6a~hUjAp<6OV^J4}TNm22VPv$loVf6WZ#4?)DYK^p78I3_(<=i>=4rN^=`c|Z1|Awje5`X zAgG(De6wu##NCMFXDJ#D$JU?t&gJTvU9GP0fy6!23A>k(1L>JU2xkG<&&M!Zq*nRK zzUc%*bB?a}F1vxU0O7(V{~$OJN?wx=qrevZHi&$R^NTmf+}&=f1X;*rCsg~1u3($r`IOnIfzl9Uq=Am zlqHIm66a%sa;fv-tV|U9F< zwCeOn$;vr=jAuxJG*c%1PQ8um{zRT+ZI%%h)-E(Xdc$7ThWvWtQ->J(^6&t`7fV0= zB`O1GP|67kxS%qXJvGlmel=QfrbmpI6dLzl=5(A`kE+*M^`F1tub|s9o#5H9c;x@= zM$6s;sj65%*XrZ~6j8KHn`YzaE7GfD8pWy>(XTBzbn*$k zP4yckzhAs}r#jgt=WtRS6hZe;`$^{I96H8$c30z9SUrpMplZ#a0YJrVL;=nW~z7(*kPxUI}v z$EWEjMe}Curw2KYaq;l-Y8;F}&5>&^5w$VWyRM`Ln%h_-^#V#;57k6`_(u1og}P#WPa5jX1T=1#p^RGk^I$3d3m%%A7=l*^wz8uQO ziy-$DWWm7?wq5O{7B++jO6|02uJViMWqc?oQJn1iiMgrACZ{+4q3i%f z3S&J<$}zx|#IJWejKqk)ScMPF&x7byyB%iM3zLTCC2CxZ`_93b4!x z5DgO|5T^nwXLhj^DE*%IJ@4I<;IYqP;m~lqk?JmBCuzB;ST-8PI^KIQlW&GSnvktb z2k0UBI$g#Q61Z}8SdF3q$}kbF7)9TSAnz_FP0UTz?dDP)aZ4E0YTl#vv!jJ)e~M{H ze}a%WL>OpxEYi1W`{PypumMAGk(#Pv_#s_kG$mpk2JtCh5+(P8hwO~ zr@niC0KIaJW<8-;mgR}Hs_?6?5A6qbvZJ&T4*U~pP$PfKq{s&k1%XvcWl1*u2O7xg z4@?bXG~8R@loG93Dbjp*0mcpEw!Ey?ghdrWw|6{I0cn|=|0%oQnNwS#tq+QQL4qn8 z6`jp+MU=XR67A)aaQ#0Qnc+vCaHk_QvRY%GJ17{JdW|icxNoA^$emuSQb&qr`QSwE zEf-X~=qWsU0tlN?af4}ca_Ng?`98S9U6p6M38bscx{O<(4v9c+9P$cvmQI*uAOX{*NN_Nn*7X&6)Ob3-NZAp+`pYUd=Jif)YZF1e9>|mL^fBbqkDlAw&^`_x&^WBE}Wyk-SP%_@-m1kw$XI56TiKOyq?@~!b= zS9@xlcQy7UyIDas=ugST77QV!XME));=LD&=BS1LH*~y5+_SF2*=qbsqV}9E?d)g<7|(*Up673-25N=k zeG!`iNso~{wK}Vlfkw|5BLaj3d=7`8+H``Ek=A8ivEF$Xu}m2mx$bgNDUq6Jg>p>@ z!7l5(fPTRPO`YTLPz5(kvpQ^k%M|q?dp&%1{xHtX3$CRGe^kryq^jEeW%N1`1fAY+ z+fGO%1<@F2{40hO^4Ch?6;{$4*VRwag*gem^b&!eKnTAv1ytwOU8D)y41S+3A_MuC z4tKd!!dKvRLKM6tz}|jvwoa|B%r46@!PB2(YwLN_Vd;gGfpR<+Td&;R`K;zLxWm#} zpei44{^b+y*HD7vHml31l7B_VUiN=Cn{dXI-{Q9TVRe~cYoZ7;bo2vk4CWK{ms4oa z_`zUGS(Jo3xYs4&1P3*Ip_gwhrkKSuyJ%^WjjDz*XsD)EIfPdTO&vS*L$ZjgmKEua zyI)}2@?-wi^62w|a(gCjsYqxW2>wtK5<`*c?>l4BP((En@_std6(UO;-u{RNu#^oF z2&WigA7p_uy;1KY&$!KosypX;-EnO*ss9wb>c8P0F4GUb!2M%k^{5&sdyG1bD_Dge zqeqI5Ar#7K`MzWK?nPEp@}oJKk@OtjiI3PMe#Et=F&+5(y$3pefR=Ef+q@`J$}>L8 z?XavdP79r84OF=GpmjV1>?dW0WnmQ#yMZFwMtqi)7Q|eGtY~s}k(*-Ol8<%~C5pSJ z4}FRS%LJ5Z%<=Rk;Np{86^g4DRTJIXvpVGI(?5ATio&}G0=QM zsTP0FOXm!yfHr(ji(rvtO>95^yQ2wuF_pEB_ml~#u+DZVfq`*I?ys|tvO(j^n3vH{ z_}l*su}WsH)Y`mMhJ9}O4QLwFR-o%jJ+ik-fI_Muo^vg)o5zGLV&Tw>Sx4nXs&|Jj zizA(;itHrob!|&pknF05uv=Z$stm`No5d(R$yTBPal7S3>QguV2E}-slfHI`#iW$I zgW1boqhYV#r8Fsy;WVa%Ur1uP81dziQ8=T-(`)%6^9#la_hB!uWz4*U`J#d^eDggI*D!5~+0+{T zsrt3l%zZ9b`BgSq7OdZVQAY~-6IK0#e^9s7g*gLzlOG*n>$9z|Z7jrNu2(!3=1@Zg z{k>#WX2unq*3W>|)MF|C3TxbXcD9_<;ng!b&I)HR^AR_IvX4~$x(Z#3xTi4?H&Q5| z0~DL0q*9bYITgf~Sf}+$`JlX`h(jo|CyUH1V>WYBd_y z-s_=rrA*?IxY2cJM4}ngzf`^Fugl38LGBY)6S@6I!D9fIx^KDr}M%B)O>&l)cz*s2%@sk^>hW9AQ%$j-`k zkN-V3K>enNkJ=cd77XbNv8(Z^^R)G$)W=~rDF zd*JV6M_C)=(s=*Q%IL@_?$^U-s76%T=T*B5cNUtv>MblqwN|;OphrdmWrRl}Pga#* z3w{-im(QF`g$dr$We$&}S6YPB7D~c{s)8)mF;d>s^avFLYuD8LqEWd=oLn~{Am+=1 zJcc7YIR{Gt>byywfHEuM(06vLkk%~F@?bpk_wPTR9W6(-S9qPpwvurEUr}X;(V*t? zhY`4x93N?nwpM0iCG~!dxt|jcgw9{$Ekk-<0&iOo(NgzoN%F+@r9DT)8*}^T zlz0>$s0ogHzLHKUej@i-V2pdRIs_|kFxqwkwe;?O1P~nQB#>KX{32~h^eSCdkP*R{ zxiUz*E5YYwb;bwpxGM;QG+Em zXLdM^pO=qk)D{p7#8Py+A6RZx%OFF3l`VRHv`3d}Hsur;La)7J{d*p24^cU+ap|d= zRk2^V)PTEg?DXn&iX<%A2sV)oUT#DBgCWVEJ_W3|B91O5R&QOH)RW(tjri4)ez(~x z(i_4-J7~O?LVh$lHy|g4U>YfxSJjwId6TKm>0wmD(GTFrmyDhXprGnxUpE_p9g>Ku zmSCEj3_K(N#{*PN!12h41%wTdtB=Ni;W~ikQ6ssp`(olJ0QV36yJ5OVhbcWVx3K)h|)wuW~qqFRv7zid0rqK*w z`pDf`x~)mba`4tJqO<7(XSSX<5T1 zy#*ZbmG=+i-dRpqM4Ux-KOU>A6g>n*ZizE&KlzJ9CJjIT3|^bqv%O|30=dYI9rcQ_ z$UnXvLRt^Jg|TT4bWPLy{! zcVar4t=7e#R6}02H%mp_%*Wo5+Np`AOq1+(*x(=5J zAblaRZ~xO&{O`wR;8U?T{^K(&snj|<9u6r(HI*p?@64~rTTGaKHFrW5E` zN5DMP*Ss$Vi{c|Pr`BpBjrx+R^VFFpkR<9ETqaR^-;9(~sEN4-eugi1Fr&2A)4U(d z76d+ocja!-LeiHF`WP%|MiTgL)lqiZpx%L+=i=z)8gaadC|`~NF06jU^2cC_Ug-$c z!}p$`kM=Cl#b-}}wk*M6F(6LN7pUX_RAgd&!v#oP7zAnj5t>YlPsYZi-H8?L-aVKR z8(`IBQ(8G|LE&vuj$7UeF#onQh)v4}$h|oaxVX&g%+FGP3g-l)BBb@ULzQpK>;2%A zsvWy&TWNZu&=r1(xAgoTpQ1!wBfNT7SJMm>W}f?J`|c;ay-0eaRf6AU@~l#E(l0<# z=^mU~fq;w^`l!oqOC}ddT`ad*wZI0G&UvIh)`KOjakON5SF+C;M z>8c{o((ZvXCdRP2bLu0Xd)IYAdS*U9HZ{>|2Xdupaah3aH3N~`2ReY=b;#wo-ue1# zLwTri%u*JEfjszppX%1LI-|+5hwO_0GleBoQ%k7(f@WKl^N@(6>=>&?@$W2i2ZV8) zo~S=p{HbWC&2h@;lV!dhzPR2vO<=Wcd*BpilYeG>&77_hxh$A=*o6KT`Z)H6?xC2Fp`cwVko zx>h+a!^e15+7>^IVQY4wx!th) z8T6&Z6+G`L%<3@7cCL6L_N+kuk5n>ewWBVj)jj23epu(xsq5WRH1@S%YJSqZuDk*yhDt&2*-^{AY!Ck_de=G|@ncGF9zZycV^Fg!j2V+tr_lMbp zoPimOQeflr@bl%Aa77&Ne;E4{_;LS&6kwBI}P%HZ;%?WuGAa z+0k53*$_DURtaF{t)AomuqkpX%nQ3qCFoKK1#i=7L5>c6l800SI0F&6Sd%w-2W3i{7bUzIyw&#nUI^lL+2VKhk7?X?7(i$5L&5`^2Ujzg+j^vU= zqgMRiZU-4cp1$kWd1-^X{4Im_^&|MVwSx`cIkDH#2YlbF%=7`gnDVyS>P%bp@;|Ey zG8mBT^OQSHOW(Z>%T{3!Zuolzk`Wwj4Lm-A?Y{jVD3D?Gk9l(k@2PHZ-F2joDU4Z8 z-xMeP*OmoOlY?iAix1Q?bELePBX}NT+kwefy)r^+ued2EL+_WenHMb;0G~_kBVYE- zD>>4#IB88WF8uT?C{6OOPkpL8M()$y?{U}9?aN`gp;>LKw|TVFjg4^F+-P1R#L6VxE&vdwJ8Cn>fsWhkyONJ>nA=?`(cmzW|Zaz`_{uWnL=4$xgZS* z_qEWErx_ic$@4nkF&4Fa|JP)fz1ui#j}xRIRM_wx(q8K62QbX2d1rB5W%19HgPSi3 z-Y=&7kshWoha9usuM3+IOj3&`RV%jtQU3keWpeDt5fE>31E@V+9upt`D5zHPSr`~M0-!>iFYV}C8gP{eekysB{}^23U2F3sLsaJ zY_wAUNqg$IpQ_7y;uV5s^-G0s1GVoufI+oV3HLRczSc{xZTbNj8#j&KP&{K^SkN*e z3{&N+{Pj&tU8}v-RWU~uCZ8^LKZe+$rxH0m+0jNiq4)o$G?=10qepia&Oj?mbG_g7 z7C6*P3#|K4@dP{@`$n@td-UnSU&WH-R+~M~X&-sN-H9n@>Szj0dZn4);NM!QI$rgS zq9<}&@Th;`m>CM}T*{A52i!9S=O&Rw^9l}Qra2S8br{8cs+Y7(^Y!H|jaexd)~?s!!OYJ$mtyKb zUxUJ0`4!1o*SkzFN3-sn1GKy%$AYa`-J#B!vTR;q=4}n1J24@-f`_|P$O<`F9EHav z-yT0Bq2&#E00Ift6R$`U_`9`(6VuUGit?gmS{ONDbGywRK&*G1{Bc z4RCjOv(++fQ)@w$z)kO%?Kv#R9lF6g|3zE=p z1f?M(*7sDzbUJJl3agSp>Mx_xqISMx{vSVf+Gds{kVMqH71X)9e^U_pM)jm1*m#E+8!L6A%hmiJtciT*JAV> z_~JN)UH^Xh0TsUEf{|Vh)TF$DRl>AAxL-*IY_-l7wFKF+@~BKNPjEjukzT0`C7Dws z@r~AFWE|tSH)79?-#t(PgvVL+#$rj$d0|%y7XVWPEG$TL;vUOcX^$YPG(PDUlhJGb z-CfUqas$Cs)$8e+#`Rzh4qsX-?Z82hbh3<-WdE9^}BfW zMyTo)9$VL}kVkCA?mw$cfl&HCDC)zeuLlbzkl^17NjCnR+Mj$PA72HZl=JtK7U?w? z`^oD`mhJozs--$5B_)7goN0LH0Ql>uwjr=T!c<%9fSt%hqN;&K2e8bW_zBYk0>-_? zpIS-mIpU6z;S36P(ouDvEDNSa@|vwihE~83DFOc2%$TH6Tf)0UG-VDje=qGt>aJ6G zvKB<5ywY}U3u;HTlOk%Fv1g0tSjLFs5mnlB&F{XVNvby%0kb}dqZ)CS3O4h4hsw2N?KL7Cp zfcf`yQH!~w3ngUsceBsWW;!!Rj9O6+L^_VG9|eTmRf4@D+o-I;g|4J ziLQNy{mo2OQZ`;X!6yMHACwOGqTaOR*ujoHM3|J z@)95zA+W%eqN*Xh3GxXNE51(D**dlCj?>Q)c!ZgTo6NHz{R zM5n$fSdt?oA9$fleC<`6S7ejU?c~uwuil&r!7kVDhvmKgumPeHJz>fptu9bB%bC+{ zrh5&Tco1SBl*B%JE-?VvFTv}W=5D|;;m#FNnE3>{gl+^|S&e^)6EX%x#7Fn@2JN9p zo+b#n*Y2}O03}stIFTaqu!89G}I51iCBOtm zhlBbm(_8l>KxY|0j-#jG&E2XmO&w~Q ztrp}I>dYk@LxQcNiW%P87lR_*G+!FJdYk?OOjef3;uy?G(8$zl4Vh$}czJh-LAWk3 z9PjswfPl(y-m*fkuD-e0cVq|%uAdkfGeOsO)Q?TqV^mGlMjA71j zDRF0Q@|SwI$jcRlSHIr@jJ_}hS-5zPyfa9-&-lD?Rjo0)zR;d;wuy!kDYSGTAn@th zSyrgA6G~JpyiA04b*`@BwEG;Jy$)3eZ(+&bM}9qek4oAD^xl}5m{?Iu|5lL^1gJjp zu^^&}ytndQOu)e?A2%mam*zJ2hzrhJyyzdX?J;KgLA~N@1F0zg#mhZpZEZVO%T!4C z*iwAb25HL3ZUo~RKnE3H3Dd8(!~cb?;NK*&ZCfcBdAit3bd|YQG*>+2E~rcub@zp7 z;upn+?|(6AE`|o9`RpZ3eLPJ%yfh@?yWIngs5!Zz)9crTv$xfmFX z*1VCouQO8SF_WJDI7ls(Kpp?^t_Sicmlbj&?)uzpR4zcP8!NJxL0Ju==n3_P|0xc; z`$eu+6^!YXD%cvg57Kz!jbWx|ZHUrPTDQEJ1QUnIMuP;Y52{5`z{VI_mrleQqUt=? zoeKv2#q(!<=Dwqy_X51v=O3%_S?hVx4BR~VM)!hZ7|1xKVbS&mf~Fr)`}(Oqd?12# z7!{$Iu=vqcvk4p~n!0z)Wb^9vR1J!#BLBMuBFwz$DT~cy*C`|&e;xIaKOC!a{G~&c zsz%JWfmM+j5W4^F9UGh%I0?~ccTmKq^?acV;uFyD>EC3F+KRTcYkMWXbKj5WlcGy+ zfsDuNLzW8z@dstB;01+84?~^7<<_-NOM{AC?6xh`eYEo@-}+|W_$S}0Jh<6~PsFE~ zM#|={?u0AgLH61Hm3lH!?wv}vwdiYULoDiJ3%aT*Y&Mhg@496K?nWgCm?*7M-OAs% zp?PQQU3XU@>ZSsrbq78f>{|LTEc73ON#(&EBHzPb=^deK1Bs}L4@o^9#{cD8~D5K%VY=tf6(U3L#xY(Tk+9{)N@ z4kcdsoju_z!xWdUkxwVUn+gikY8+eh<;h%Y#GpbNtWo-S_UhtKyZ2w?8B>ZX)d3#k zdX1OGb8PJ3oO+2c6;Czb=8vs1?F5&7rL6tmOR3b;odwUn2fNYsy`7+_w>fwS@9d~W z!R2Asp%lu#TlP*k4@6GBjm5=Nag1r{eWaqZIUz$;PDB5JC&L%6vGpx>WK+Y}-gl&< z2bSzgbomOE?A#r``euLSfIog0kR=R&fj0G0{q+lYcf;#D8GmKp2#t9d_(o0vsuk_) zU>>C=rU6ArDZ_ORHFFrRq<*Sm4K8|hUw?EdH*lM)b}JOdgG8k zKM!h_@Q( zPB%!`fC#MZgEy9mXC)&JG!Vm`2CyDFL{Dwcg0j4}%eVXG__rYYc7;I>Nc>(unq0j- zmrbz?zrWz4SCeXu&LM@kXE?MG$ObIrMd)T=wx^q>C516RaydTI|8>Uf0QGXU;q6>|%38h3c}Q{|Z6CQKcqzEv*YqnFeq#i2#24HKTX+Z(v3l6*BuxvkK<`QpxAdk z9V$|o4ELh|eLsSGc?kO`h*JdWn1@t@dU>oxOqaq3I&^~ClYTw`guXMjyo6lWG<$xg z1a7wD?TWej-Ov9cC)AcC)#b6vvcH#nGPv9o+i&d_|0(yc8<8;1gW&h#i)%p?OG5uJ zARc4+)sxhS3r0mU3$>IK@}X-X1~QkdvAZ8azcceDL0i=bgFUM9>+jmEpdQ{!Y%#gp zJMr4-Su7RcDEzDnb$a9lO6^5l?vFv}{S}JVV;SHd`e|p$2iZ{8R>8CN1 zM}Uw65d6h2ms-J61Nuj(rg@Yq@P&=p(%fv7DVrcEm^t^8=$|xgz{@tSh?xI}h z)Y-cM=kocY$Jk5cGRp#@Zas~~4A=fsBBy)c=#GoNaG6|&ad(qsk-Ti|btq!Uww_~e z*-PPWdc7OWi^=Uro6@}mfT(~*PiMy$6BTVP69ss7 zsn@@>w^m0ae-E5pPDhodSLzjvB=mAk`o)YA+>5_^c_u{eISI=tp#7SWiHJgapVj{DTJiZra@x~S6|^Ln!k5HB{@>Be zww4Eb@rsB_?C^sD&^#%=dyvJ34k*zxcvx)Go=G?NIWh)Ou3RMCYy9!SCg{=Ml9T-! z`~Xv0vmDQL;tc8I?TBBsWyPh;^DTF}i?6)qdEJC>rRK@vYk1ODFT4{90_sdaEX`lE zrS|`z)Cy-N>QAKFXGntbif(Ik`xZ0M2DgA}_lAEGO`V5fEY@4uwbeyt-af6{^L@yF zRldVnfxV~jbF?IxP%G+LjRJ9XQH+e?q5x~046A!3Ue6uk3bo6 zlihO%J(4z2bXkJE{kJIf4Tf^n$EUAbzccZtvnF17@A`srVl>+JChb*pANe%ElbgMI z+oejKibWOf=g42N%KAdV8r}mZx0~69&xi1k2y^~@9R0KAf&ZtAmpL7e(Xo&-bTa$)Q8Y!FNKdcnXdAb%r{#h zpK-*|e#;jP0i_0@jwu5!;Od9RL;g8f2TJ@rgpYOuC^ukYo6irH z_^H)&$U_@`bAx-IZr#Y|Pjzd9GikkM)SM|QfUXwmCTQhSPE@%I7l}|_Z{5giGjX!w zuzmkyXL;e+@z)lirtkOB6!-Bc&LZ9Dl&n%7HqlIV1is!AVsCZo6^YhGEApk+7t<_y z{;1nOe|h77D{F()jP@@yPruh((BQi{?-;6sY__75i?oPYSpDZA=BAKx9$NaEC4s_W&{% z$j1=k*TTVnip%s;03p+PdAthvYnAUCeCOspDa<3 zo?&$@mPESDd$4+u#@(-%fV888X5v>Q*Yxm$HDx!VUMuz}Cr(52q&iAI zvC|Xhh}(IB2_jc^0TTrs5%{UWRcGXx+lC?|0J{AD-4;L4{e=){ty9trGm<{qz}%G; z(ITVoT9q~tT^+Yx`4$P=OytHg1ia7%WSGeJ%)d^Bf6F~A)mPcLL?XtgP0#1(=#+hp zI7+^|we`zV;qy@0i0^JrS!qo>AUupVMQBQ}xK-7#*?rFVGI0g$1woNQO+QT#n4i?( zj7y{2q(IeGRWb-9U0zY82!_+1=~J8wDXa@}zd?NpyaBrBMW;C{aAm63(mP+8A1s8YLt-$G|{p}fBCh|7kR$L8qO>z(MLiC zLATVod(3uhaw6kRm;a^# za&k!SQOy-5t;d~Rpmd*qW6%;Mk#mcatlq`tp-S@z`?O`__NSaFu>j2Z6;d#i&u#(| zbe0ZScU85G^;JnJ7nc8$W}ntlNiT6D zS}_Ba>Yz$_orpQ<;I`#*OgO$uv{$4YZa=H}p$HHiGys(Pw$`Ud;SC>!!G3CTr^{RKM7_qM=6 zpsYzm`A1?u>X^^JVfcMlYZ%Wcfq(Tz7;Zhi9g{R!E27qVxx@O zK%@#iH-zdI%HgH`plND=U?scxlih?j;+Y71rAH0 zGYQMy%-Xt|Bw~60k2IV>nD8ipaW0F>O{2E3&QaTGyx8g4lC^ZY_k`QTsDC;yS?o3m z%|1gal;jV?+=G7OXIu50+3G^#4<=94f~2Nb`}&^6ng2}Z<|8`}=>U(%34l`a?BD*& zpELaA{S!hfIsqC ze0GxzdOxP8=ebO_#nA0J9*5783V&+kmN|XoIQ>L^-q;L1Y9J*qaR3=O>N5cb+M`I0I=#Z#ov9|1F|y^GXYXL;Kw$m zEOVE%yC+=~^7M@8SK}@QrnZfn{R#I)?ZqeVXW}0d$pP^*5^9U zO`<#*P4c$Li5@cijfj^0@y&sRD*}hq*(t@Wb+=vRpYRlHcQ?LDL8-oSt!TSe;}!Wj zrA3L{eVK6WcXY8Y6Ib@|ku5o@@Z|%`;RHC$A4UEmQoK!qXMpjI+~`xUzeT&x&54Xx z#b%gE1^^XtB<{=bpG5L22N0%Q@Q+K;QR$7pUbi!(3j9xqMnUrsXH@cac_$tJ+iy2q z4Gx|Y4rmuVzL^Rbqh(!W%0=Waj(r=&>m2`C{?mzd?E|_@AC5eLa7bgvX$dTC|F3GK z_CJ}T2ovCe5bk+b>0cd91N~mt9x2M{0mO}4+140deCx@&xmJVvPaXM5Zv$D!O{LoR z%gv1GSq=PK1^Kdee5r08&a(b*z}nN}*M4nNZ`kD}J%Qz6$KwFsf+$bWN>*9qZxgiEEsmlD6yL%Qhqo#+Hn>5&}zJ~_N*Qn z8e$q4T=52D4BIkKtasybBN=P25=aVZvPw86HQU%R*|l*vuf3JzHYv%D=KbEY_tZ&p z$n60`e3S*U?qHVABKw}-X17fCU!3w!*HB>ZTvv^(=Zk=R_Gx#r&g#JlH2k<;sPp#{d*b~ictS|k3hjjIDRvWy?-yz1iq+fvg~w9ba9y+FSL;?E1_n^{1_l1 zC1nlznKU${q$-tVz}aU40=fjlxyPGf-J4ek=+*G-V5@)qX6jU7a{O=gYy5}u&oA7* zJml4r z2W+G-!>VO?$D#%*=>A;UZ+HV@1SGGLu6we~Ho`oOC&h4a+Rs@)ikL$^-EYA+&fSM3 z-ixK|M?ew-aU1@)TXukK3^;C88)Mbv!0Oz-XRP;bEEWoM^t)?iPt*&XvPv15{_&J` z%nG>|F(N+GepKZFrma-Bp;~|SkcNa^5_yZ)Us)2*%Kwc1>T4)w8>KRNg^J+IOT;v} z8<2c*{^1Jp3*@^IDrh3SncCKvv`7}YQ`I>qm<7nPKc6h%YW4N>D$P4utEzU`Sx>$m z%~(Kg=n&!q6nbN0EkV4~zvz@=jyHbKFt9mCjE`SwS#?BV(Zz$mj?p)o{rUFo#FK3Uw$&h~?sx=m>}1*HEILI~j=m0g#i;kx zOLn^w{-gmvqf8j?y!sw<9`ST| z%JHlOvf?nwoH@&GH_vfdxBCV<%F`Mpp!;mN^e>+ymHu;FI-bh=+7XtiUOjuTXwD{h z(1~F0GmQS4nECFRJrJGd@bwB84`8hOP+IWih{Z5HP(J%|bA-s82R%h41V3_g|KO(rfzoofGQ9d6r9c(3S~uQ*zWS0PeRKP3JFk z0U(<;QHR(n(!DZy{=H4QyMZfYHf3qu%89_!5Ngf%4c8%#sso~X7whVPa);_=Luuyd zukh6cB9iOZuU8n>xVyMuzADRlpC8TOd&CHH4l}q@FS(h|Kj!L-xS|dDG6Xs>eU=&* z(@>Ri`CjRI7jsk-0heB*)4`TY6c14?*YC;_iuCsM{A^?6A zepNw-xZO9?9#OrI5K{4aMyW+wYZ1F6e^wiCtqC_l|L3BvDf0M@E74v4=b52J*mQ*# z<;j_+p#*Pmj{a+x<pM=PAz;`0Gb-&C z>aT(i4xyaJAL{nKFI{KDU8Y^(=g4z7GBsUmcuo18=<}2b=#5u#aruEuS2QMD*X)5k zuB8@h*NXjwm?7#2N@GUwVCe4`>w**d`KFXPR}84mCPthsXG?hG-4F79^yrb9*-q?y zLHO9Og-8l_SmOxt4*1Huj^?v~5!b91`-alZ{Nh)c27BO_theBla<38{ZJb!k^sgh{%@b-%n$5rCx%xMTim7Y5c~kuRcrFy1{S&*mRM< zC(lP$qj?=?NbIHFZp;O0Ol$3eAE%-+ZYvg11|>BepfK0r6`z^vcQt{!!PA$m2QhvY z&X$mHqC|}cb;%ajUBt~|17hjO_MS7!5brUvCGv9Y90YyeCEnvRFxRWn}xAVd&9ff5;2{RG(El@lB!77q%s-~K9;5%_9jq}$T zZ51I^V!R<1m!Ie9yTE2nXPrz5B~4=3tiXrp&p1=q#rJY3A-_u1-`~OAxqz4Ykr|CW zMhVoax9w8$vnh^JTB)VfP!Gti*;9Z~x_&f;(`~`Zu}Q2^=31EOO}GS6Z>{f={jQ5{ ztTS8QHS2szp*s9tYHPIaGBh0B`Yo4aE~wbIMVxufx`wiga%oN871j9@6l?IVmA=mA z167X;;jI3hb@51F6J-qKUSj72oXk6J=Hr~Qs0uJJWtdPn3_o* z5^_YKnl@JyXaC3ertOnZ+o^VHh97Y-?x3MW_p(m4fvqZ*nkG_$U=_CW)x^v4rh z?Q4Z*vBi|kh^()e=;qD7xcJqTE0OaO8k0-|X1A$GqQ%X$%5+rYtHjxhiaRx2clcJ$dRfU)veMBgoi9DJfNF6OvaG3$ja{7FDJqa))dIvp@VJ z<3=kK0HB>1SqNI0Tyh7gj^5KJhY?*}3v>H&lYG5@XFk75;ZxEb^r}@m!r46hg8Jv? zZWI;@jva3wEGlEe&&oT>kqUL`TYjKV$z1#J@9W7$`vRXWU495Q|0=A(&IIIz`3=N* zZ0DNYnSs#1KCF&sXssq?!!Fg}tacY0HNeDNv_qFT*#Vdn_gWeoDeX6Rn2z|-wK^!W?3IP7@F z;vBUVk|%xsvx|EqM}Kc(HHZjDyE%+Jgg^qD8+>&{Qoq^N$1HaEN#0RS(#dldhd)S%DC@wvuYh0Gd4RGX|bNfNiz z{g|67{`6X;5K{up^?{4sk1H{WR&N5lA-EW=uH1s)xvRhs$GuvLv1(;~l{K(iePIV| zG8l0B;3oZ5<#{awqE7r*6O1}P5OO~cYRo(Oq%wIZAHkkf9j^j?K%o#R+nn$J;>G%$ z*2$_Bz55YmXV4ZdI_TuG@P%?zAz|0z#1;Yqp|$RyG$gH6iM6ir`RUAtqFgGIzt5q# zvtHp&?>M%Q7Zt^x1U(;~0n=8qZ!oG34V~FUrhp##1703kZZI9y2)F(#UHm1b8woaO zCM7Y@2zIU!zGiJswo6FY=;o63-RFV_sTpn~YytH2l7)Z4EdOL4^IIlk^r}I$g+dek z%+MZAP+7EI0D9YP=91oSGA*tL0k`8V;U69}0X%y1C(8%~b~hB_9#`EyG33)OkX7w6 zfeb?DNx|7g*3Ir=?Y}PXKHP;+v6c8NJuGg6s1iHDPLh!+>sct=l(y!s#r=V{QTWHZ z8JGgJJ$difH36BLHG$!CQQ?t1$m@2yH32^08nR0DW;Tm;5f|6?B|>A?=HBHu!eL%r z-mYb9Mzfg2GAMfqV~okdmhAc{14@FYZLa&b;l0?ftsvj~!MigR2qBRU+|Sdq%X$0S z$tWbkXxEYeMQV?;nAZ$%%sV+jbp^8Q(sPucMN^?BK=LCn3@QChl&&k=O|(cxg!Z}L z%w6J&iMni!sHhnCX_tm)6YW}tb-MdOESy5Nd_+S~wbi{%GzmK_ynW@U&xp36VWFp2 zM)$Bg`NysY*pp5=iTRs-(egAwGVDS}S<144ebnY93eZyx2iMEwttb|*Gz-uP?QBTV zLHYKLu)_kPa7;EA6%e12v1+M)_#)C7(^L=It;$1J&vU4jwki&r2!CvXH` z?fK->$C8CiT)CPjWePG5ilq#~8k1hz>YU3SXJo8{$KyUFKvovXR+7?m9-4o?;S+>w zzHwE#I3-iPb?pJn;i$Qb5v#>Mo?!z6|HXkF8$G$<3mu=sIqh2Pwn&TyE1Z!Az-fDl z37^B8`dQw>mO9xaI}N^uDUwZ+5k7CsMWg)D*Q8d6bg@Uy2soc+ms$ss>;$&!j4NQa;va?G&AsM34=&gE=)Eba^!Sd^TEZYsH5l@a~{aES*2FIeZcTuSgGDx&X z9Y$;%egHGQ8`28deugDSchqQxR+FDP!5pL=elJUf8|GBOo_DSEiW4CNCfm+2b~psQ z1Nr*c0hto8X!A)K8E_z;g*I<-#^ojBdd^?KED$*(trT{Hygc_1pb_ULj% zyMiQHn@-7U8p?8{zhkghF8vcTesFa}Mlmn+H)^)TlG}FuA#dto#0*kWsEgnxkYQfE zvM0{QLc3(l210WYHfwXI-hEW_qP7QjDQ;prJjan9yY-=Z%Ux0Sb@brHYDePeUOIDM zubcEAD@|{WpF~5?{lFY-`B*T6HDvb`SQ&K=YAxBlbs`jI(gf9ffD2m$W8rf>0#mP6 zKe!pVJQC1;v>5=+?h?Kc4~9bTz&n;VEM!g&@@2OpZY^?iq}=N)*V|ttits#e3oys! znQ&?FG}X0yxEK=g8;%QFmC)iTq16)%#}PriH(m`d^>b|aZdy)1L!NCqP~d(Ool7AP zgcc-6_tgyHo|A6FLgrFIsx59X&`2Wqq<;;}+a(%EVA=4we~j~4-Ii*a51;uUZm6Cu zt1EFB)7lETkNb9xJJL53MV%Hw(sb0ybdZ?u5hezsnETz$m_*q#6r+3A9UlYETtuVY zB)aPeS>q9?q-u000PDBqVf5*AAIyZ6)SN8_3i9%PGR!=eCY(HC1z|4P;Tml|G_)1@Qs0_fY zA&0+W49!nBdMSRl{iM4rnNSbLhF6DdNsDQOY`z=_Kbl%@n%~1#)U<>n+M^3Rn@dW9 z)*443n2lbc`xscBOxI#5Y;DBijUTdLNSWnSE(~6aFv*sVSUlSD7+I-X^t8o%*XY9b zLp9OpG2Hnf?tHbWefe!_1ttP=Sdh}Xw<;}Y9R9MjEg$jId)B48%V{v0P6oFvTGMex z)FrR1>SWZ?uO`?E*0p`9?$hPV(ag*{ZH*r1NTM#>(m_|c&elfjz1XfrSqW^^+MH#6 zBi6+LENv6=L^;7m`PMj{#qaash`>?I{KOG>v<;Xk;5|DJ1t-pOI=mdP%Zh36qu1*m z>4Kq;!NsfibJZ$6(zw&uXuwlERSf=+q9kH+6#I4}HBz$NRz4Yp+efImwKxAvkj8x_ zBlOPvhVD9#2aY{WdiP|Z{c>unyV%rB$Jvq(O|qp0?~M=BLBr1PYj9wq_JPIPIV%Wzyp~6rLei&LPR9e}3&uj+ zJL;j?FTl+4-FaMo2c(MOgUJrE@Ui4so(Upg8ite#Ks;BuJ@@^4Ysgxo1@>$YdA9Em zCjTq11{nrF1&5^o%sK}Vg)eVQ02Gyf{}&vIJ2u>HUyT7*} z%s7A@<3g?PS3c+e351v60`2gu9Sq-yrfiz`La)kv8kp19H*-dgCtMt$()SxYjXK>B z%J14Mg;7YX&GCO)^K9#~7omEIz@6jVR6cw-o$4&g#U%JMIekJi?=){TN=H)~c41Dx zq}=o5Z`pc0jLP~hqddo`>%4_MRT0|^&tSbeKtf_u``q*PL_QG*4GC_U4tEZgYTO_M zR~r?PuQ$!%0-J8Uc!UnyrtV1RB3o~yq3w^Rv^Z_Th^l^Coq~oREa^hqb!KLdOz=;3 zuXTn^BhQz+j$OOfk}JB-vY|Ut^ZpGZvl0A@Slw*Nh2074DFpj9ALGJwhGMb!y&n-E zi8{tDXG6{sF%eH@%CFwFy~?D90^1qTaNt-G_VLa^e@!?$)63t9U%7Cb^-d*VM|D-< zm;qLwi=rOVSR@p8UWQx4HcV^s9wFKwo~wI(lDtO|;lL=Te;6*uq!w%+Sm9#4A z<<5XpKS7|+*XE>T-Abkk$A477K4jJN7ECEX&NX%^zO&$_Nq2%$bvA8qYc*$7x7qq$ zXV#y0H8tqu<05c=Ljzxt2bW3dcJKdaK&xO1zHEPznBTUTz-i+wbnKy-ZAGo)5m!&O zK7+q$6B3cqH_PwDVJLQMG^WJXz;bNMOqlDZf7sF!a+?e3jvm%Tzb{ESUC+naL0MUz z>h9-1%|BlgLa+7j{B+m?1|=U|xOi7O$LtPzF&|gmXf`co2ad$AMBf+L2VkGDgW&6X zzQB(jO*@wZBW8n6b;I^lVYa}DMh1O6iH>ipNZ_Clw}Us4D9=?eP8?l18b)^AwOMt= ztyJI=b0fxxm2Z{ZZ?5TDNyrnw94X!0U^~5QF^iZKnuI**IuY>jP_2k5b{>5nmuAs= zJmiOJE22i;ca%rGZ_%zc&-{{^doFv;f`K0--}kcGS1sa z%ZAmD<%{fw;QF|3)n=4B<)8fID(dg=o%IO+>~m|0g99)V%8Wx)gM!+N`=BZ}7`GCc z-A0QihlPx0XUEOyx17s7R=m?IP0yDH!u=NO;!Ls_&qaD%?}A()wQ0`SxH|B_B;xR^ zF0d!Rw(hlSh%;4y|6i9+sBPXq-QPID?FD<1qJx8j@&NLzm#%9M{-S5mlQ%U*XLzmZ zF?Wh;$&F1$M9@eZZk4rjAwt!2=zLcScd}%N#Xx0`3=IU+)o=g9)^rN@a-9@|!Hhw& zhdZev`i=~JfxGr9eI3?>4BDN+Vx-5PRF>Cv3zL~ioM}zzmVd*q{VOPzR>tTR~b);9eXYu-Yt#lIqe^Jh)c z!tFrZ=e>UQYhXH0;J6*B+WT;~I~SkTgq^psV%PKSMK)|ju901Ww+(j)Jo}zzFG_ia zfkvF*u#;V<=)tG%YP!0SxN*h8qK;bei1)4jdv8nP(oIuFYz6qZO2{rn?zp+R35>9w z*LOXM7!HAFJJF-6RriD}&QC2uS3zS()V3o~J_mWE|MTntcvl9pP*j}7`4sXj54xNB^&(H4}GkzL1K5Ns!Aa#C;lsxO2(7g(8gtuC$A zYSs1XXGi{$9#TDKCSym;0R?i}?alAG^O_Fa%Rhi#Yiepf_i|6Sx^O)v$UXNJ+H3R| z&lzRmlPy~<{_a{PB{{Ytd&|3Fe6vpahT?+nP4Ab4e!z|YY}gRBH~dy5HTA?Izw`Hm zzKs5uOLbs<=?2)N4_EKv)pJv69$t|vdL zsuIu$s}@Ti7N3%kn352mYHA^+okx*zbp?GTKdCxK3YfM!k0i33tSpfVx;i-@)>H7M zPm;rHca9qy0RVKAjXZzEZ!k7lTE=aD2H=+8W;2Kd*}C$SHd-iqhs_WdUfquZ z@|UlWKuZfV_#H?jbnQU8(H#x~F1l}RBh&LNPUbntiHWo5h|?Lmys$4CMz7R5&scG~ zkDsjPeWCdhaUREoJyZw)v%cGKP-V!+#ZKc(7;TdoD=gOOY}RU1+u#6QOgM z1#YPqJ?{@?mN)~=+kBwL8k1y>S)F0SrHSYNr@62GiX&Ls4jLRnAh^4`OITcjCb$#a zCAeD%?(XjH?!jFammrI~>o@n_^ZpOtIs40=ot>HPs_uH~sp_iBOrQtXDbCmXW}p@i z77`a%W9M<(ZN2H#A^%c#5!%J1=i9@ir|=Jbh#JN`G2hF5_Tzw%>)M0AfZfx-udg;z zp6LRCfXa5izwBvlq{9z6>`&-F@Vs9P8nXj9T?4fJIr?=spTui3lc)Q6hotKntSFS5 zK+D7wDVeVaCZ9WZb)G=waeaBen}iVz%k$pSwmoNdP1Zp=#6ZZs-|)nygPtvapIw{?5TM;!v;w_aOY*1>}9hw0pL5 z)C-)CcU*so1d%5SMfvi29;HNsU&hA9w0l^cj~~(Txaqm5EY7nsWe_h#bN^7%Rcdv< z7Yl`;y=eV|N6dFpx0>;TRvp)^`8B_E>F$nHI?o}%@$>d-c;siuWSXGI^I~L97p10# z2CLn6-FE)pyaU;@`9kC7qyS$t+}w5BW-X@8(+9_=Ah4+-k>_r-w+h`fzb0c6V!Rot zm3!1q(S(Q9(KsKHM3)BRqWL@lxH65~=V4qXziXu}wEmh?0tXw5*$2|8{=4hBFZsK_JbSV>q1ft;&vq{Dp-QZJyT8|emIgur}KW+CFh?8Qhg>My4q@kM?cC>HW z7rLPCh95MEPTR0#gtOxV9hbmY=m%?+IBmW|%t9}gkMWci^{ZM<7La3gWbf^DkGn!R z=+t8Hj#Mq;CHi){Ic&ZM^4m3zdrO_kVtiOxg|x+usB|9t=hTQsalvbUVEa zl@0yHslS(pX*XHUb2G$>qH&x?tGWPw&`=*I%u@*z6Hb|bBb0Ua|LM(VA0S1 zGHS9~jV|RfBu}yotIL|y{p;(i67q08-9WZL((&+C`i2M_kW0ZpymlP?5#7xM7pX-l zzc=_3Lduo9lk$yJ3zZ16L|(_*383;#YrBRd8P^FdOf7m=b>yy@$Me`4A-7_$2gCZ^rVQ}bIDZ?IdaWsvW0zfV{)bA z+Rqzxr8^N``q-e&OJ*(Z zJ#EI_Vx_U1{|)DE`ZExI>BdEY|K8XJQp7Mr_$OcDuq20(YAeXjJ<#d1U1p-?6)aR{wVi%fzUNpHIqj$4AypTx_WN z3!`3E@!rpP?9|}Jy>c+$W{hEwzSpa_+9!haykX^KsmOHLNMeG&MYNyURV`%aW=hH@ z|Blq}GmSIW{S|_8Nd%u$J${7cSBOmKWD?qZIgkN)bXo9n;#b@ENS-av_)}@AcLlUzktb^<=hGkUddb@8bAp|_7c|)r3;#wl(_AXYWqQc5?~*HL{d8JPY1=dJDj40^v2u^Z z9+*FsC~n}PT-3RseCkQC>*^l z2e&`Kc$+DO=V&f}v~vvk$J2rD(~r#wEqG9zRWbxEfi(HB%)--xI@?{GZgfZ}> z_|Brp@7)ZEqBTO&LXoapRCOR~2wkZ}9K0Wj1KlrHVX>>lpf`Y(y80mR#8KtrlFfiXW*6kt3{S^3m zZMU>sitntdrSsRw$*cytiJ}1;RAc+n7iFyNB5(@ig<=@VfEKk+;;B8S}4X1 z8lktZza7=guznL#(sd$)kbTM)aGEu(&+Qq+lGo?;lr2~OjzyI?GAWr!JFLzgfl>N( zGMled1-o}?GOs6RtN59GvN5>dWlH$9|L8Xij9ivRt(%^U+V5+wONZL@#cr0w5fpgc zZcueV#TQY->Mj^mk4&92Z=t8zyUKK>PQv$huer7qZSYJMckgE`RA?)lT?Pr!TCKt? zR`>mR&FjDbF~t}6i)MYFhuh+HhuZrYbUb*y z+xbC6T%9mFX6C2cV%-CyTxs#R-N$+wIFvv5w2U@)T`+p3L~39oZVr@spNX)90$52} z@zzmXNjHk8D|LPAxDi2AN$+@5rd8(?=rZ&Ow3yrWM__v49%ad%5K(;`FJBJNUA<2a zsd(@rZz=G(t(MaukJ{ks0ihO_SZU3qQyy~!iGUX@U>6d4x&a?IW@YJ_DG-m1O%xp< zMIg(jRRI>gkjN4wArrj8ObXA7((jKECVt^y;1b+)f%}_|nUVKlb!ylHdi`bX@H5J= zjp03pCoF6LmBW-UjLyq%ps6D{X6THmdST|%W7}zrVZPEvUA^*<1bOX@0btWy4lI6(eEsxKm;R<-3~R4d`vb{vh;{uZ3 z`iq6SglQ$%&SBR2sj$|UG0@iMy6f9JtyUm z`lj2k%AAq@v3I*1TjZLjj7z-^gDVnufhB|&%UL&_8kZJpnkH=oX>{^CA8Rswsa<rk}{%d_d(Bo-X}n`E3ASehupjaDi7vr$W# z|L@w#Hz_olEC_(mmyMx|X;m2SN(v6Pd@ENP%=|_;3&B<&(eO6fH%aZYXUmpPn|g9E zIu)dpf7sibpVqL3FB9To_0=&FcA)3)$HSX z4aZ!avp^d3Q5MaJO!A}zpQA_qsuI>MWP20B;-OB7C07uqX0x*Xr%ODxAQLi3Ozdi_ z7arcJ7`Hq3qg0S~8^HRelkVxTnhHYr+_oMp`#=fUA+-06uJ1UJTI)r+L%-$IsHq0f zy-eH;lvw{98gRb69itz_S5zEoHCbv0I;w4=v2vT4*i9_MeMp2grDi$YKiE%|4K8az zAP%A1bkj>swyI6(oufnIay)LT^6B>nk=>HxQ~n)NCAN5JZMPX)G-5+YapXQ)>MLXj z5>?h%e~L`w=D@#k?&}MVxLDeT0Yrn0aB)73m}2F8H2XQFQ0eBj90x=kHv6M-A%Gw4 zAf5|@4tq1EVYT&ykyK{79Lg>Ta((T1yjVHq;BrI%7`Cy}%@lb=NxwyEP-_<^Ruwr-&So$^) z-W&1c@2okyICtM^&|J?K^80#qNimiT(1P(%n3!?!G&C?n+HgP#9xv1!PDLFepVo8lE2^y4`fL{-&-v?pa;bv(5sXEqkYKfQ$tp;+0 zJW&2$N|`Y6yapP&nPiq21#F0BQeMdzWC|!2_xusovCzj1T&*)YDve%FP^E(1&F^*N z*DLlt4s$Ytzv&%ve(hMVtVZ!a+sPz5kE-NB{rp%N6`|w!-bGHjrKrDYf)q>xx(V#U zjyL@Bt&B5uaBRz6tSA}pLbi@Sef+{8)Surzh+4XSBqcLZ2E#;MfKtZPw7|b;i??+C zJ9DxVDLIxsR>SJ)m++CtPd&W^mN$G+957SginT90CTyM1ymg4(%<__aNm0lL!v~4& zSbYAve!xnjwBc4OURbgwrO(RF?$#^*iTl^KnIKZK!TIDx=jQ(8B?O0_fEa)u@BSIFYanpkS?Sx} z`sSOy^l42P{5=s#m6ldLX!j7~a9+u=fa?n4KP=G0l@}@K7uBD7Shhq`+ayVLPrQyBX$(@O&ujN4xRT_tNo9T6 zz5V@xMYIOrh8#pdXvs?l^Y!I?G+PT(n%oU7AC7;r4np}Fhzp8RV#32eeuM))W5MLL z*eeKras~r^j#?-eR+w$7<2Dl&|@9B;H6?iAUqICG{(U@`Gt97ogMdSJ_|_dB*tqfJ3|3~{uz$H7d# z+g}shfo!YJ#(%6IHxW+pIa*{0-_l6TQP;P=Z{@;#M5RDrXQ6?-tqTA=LJCTSIMAfm z%IB2dStd?te@{=)6$$UDZ9(!&_@leHtfpH)eeww>e^lZOxgl$cZ-_ku`pI&SMnr*I z6vHQzNr?YZA{M*o^d>{A>SI4w(xN$ak5eM*nVn(=|L4g1Gc;zxS;xLkzACAr#skKgjj@I+b|TLYq^sO z{Q96xrK)mbWiT~f62}uri7`j?o9!a-7JcWW&WnqS{KUUfrdI!0EG6i2Usb@ODnnx8 z1AGL7GC!b7l15lszr!(Hzy#$ZJP3vA&jxEi|1<0i^bxe49#U9x3T#%$Z(P3RRFBNX zxv_M^AfonP0+$d_82JqC?}$$Ktn;PTk5)hNevf=poIAcX81UfZlJqPd?I6Tw1of_X z4mC~v(yIKKOwekrF-{uBwenL&Ap!t<)cMMk@SHXqM*z?qrXX7XtQKN7(?&#rmG+HV ziXGuszf-YdhJZJ@U|w%a=$z@eJ3*R+2HqyrcJS~xcgv}VoDogaEf)3D{DyqX znmruQ!qAPr00{vTC|2<$e8O~W5>^e{zDin~@##NRqYByMM-Etvi{YRN#+t0xCs&8S z2GiP%`)e7DH{x-W=~|NCvF+f}h|N2>71eb%=A_JkwnJ%*jlNN83jxe)Q+6J3Oj82@uW3pwvnkdt3-c=NU+*`(uu;6-}qcWa5} z4jZ$paWgoY90ng@dO!B{QF&lAPF63j!O4NUn#W^nkZg;G)jIA!t&p=GI0JO@q&j`v zXA;+wmHx!G`5bRhY?Y2ijT_&P!-jAd@)s8U)?ZK;K~Qwsa!s}ydL25HShZ^9Wi1a{ zH&n*GAY}ubPQBMZhxMCJN8uA_&j!-v62As((;jFj}w|_6FyyS#Zu9 zaPdCRvJ>Hyin_juJAd%`Iywc*v^oN+j#_%UB}UT%m8+I{e?9l_4kQcJhaUcP`LrPC zdcJlQH-^f;zM|OF#m9n~0_m+)qK{|Nd8&SvX`ONX4DhkXJa%GE;S?Y5!^O$#M}7!Y zY)q2)iqTa}17)|all0G@xJX$MDspo8au+OZ<_nhF6oqwOw`sDiAAkMBGLWOg41Ilt z0SUsT(J|A*K0+I)jwN8AjsWh7ugy)6A;pl(`9d}MrlXW@39#z(s&y{zE*DBv=S-*c z+y22QDzfa-ej>zdyDb;G#$h7na5&ONHuLltiLF1_4t&*2~oPf8pBOyNd=>K@9 z+F8YH(bjDXuE==ToVI>gSqNwL?SBu+OX%*fZTCGV4v|5Yi7QqlWLj>|haC(K=E-BB zSYM7j7&ADsZbp>IyJ?uWN@mF^3A5#antK1A!n!ZzdbPOh8L5bN{GeYrzLiVzWwo9C z<^MrkXWzX>?CmgFp#AOuHF1Y4W9mZi{BV!U_@M;YpGbr)b)?NR!>&Jz^)9toghz8% zRa)D#Fe(My-mS0Bs86=@wiJAoAwwXix@1ETfP4K&kz5rgYr>r#x%1d7rcVIyo|S6P zMiY2hYGvdxYQd04eV>;o!yxMTT0q7hqcZK5+cK39I@Hbmb4=1*h9>pi8HBGF`)Sys z+0!_!5I5(8cMFDwlZ|`hu${gz#!43)$cGO8)4cxD$;YBn4NhEy6Ey#u(G0fR=L17AZbxmTNm>Vh=yjgRXQQnL6jhYF?qUhC$Ce>%V!&O(lF)7U zu$XFI#bMMe`>_i~EN{N=34QimpPU#e!`aAjUcF-+t5Yk_&ffH7_(CJ>v&*W(==)Aj ztb0oLk<_4Z;b|rf`x#9lbb!2m`Q=S2TOos;f$y*uP}sEw_xK{F2>8zCW<^6#?_DK< zGExae_dCDkcmc8Z6E-cj&5G;W>A~`nCtFy@nqN;2zzmED3Mq?!z-W)H=Mdd~+JOQT6I0iQ!R%HgkjO={odyOkM?R#@DnVkgUx1gyw!=(lzD$L z@>t9x@gZ0ZqvJ!v!tX|g)rMorWKV*dw!yJY0yYmXof9Fb{ss#$8{qxYa44RgIvwx# z-;ywf+~=aT>);dvaoW=5ZO!&|wD5W5vz`1o3y4$~hw)NL2>Kf)LJIe(0NlrrGF1tH z+TS4&T5EIftlty7>fhzHT}V^>+s!5Gq@; ztSsUMEwd}kdeH!Q91t2g@#gF{WBK&&L-uV%PKpeL6GRQM$Hl?WGc0v~0U^z#| z%8Of=Uc0P8>=EC(+UuT$j#k=vnoa^6p~Q$el_~r-)h}Y1SnD9d`~fnR@y9oTEOCUM zaE(QmH;{SbVtbU^Mi*aaddml38Z#;)wzgKZDor0sYUR_LyfM1DQ&xIb9_YvkI}`Jepo{K3a(0a^JA5#Yg=O#0vm=C)TOBEG*pr>4W5> zOD(f;X)m(0_QdqwSSTk2Eu7y^E(Q#QILv>5^lNM&in+Nt(!FH4hR*$n0nJ*KlJR7u zwEr<4b`xnoVyZD%zm0TY{O$ut>**x_a&4A8P(SswLT?_}>hhV!f7M zV!PC_j-y(SpT}d3K&^bxnDgy!?A|=SD9puk<(F+ze9^jj2z|-LbyZWWVNX=t77@S- zSK75)-M%0nG!3he4ZYXpXd-UHw!ExPq1raxIDH=_vgf{65AzZ3_%w>l%%5$-pk< z9aDeGVWvv2dx!fyhWB1q0^rR-9+rx#ydq!Vc}tY z6!@H$E92Ijv(Q@Pv9{|i3aUCmdDjO2w-k&l&AHPT=qn}jXDzv+rvDO}fi36pBW3ed z0KmFqR1jjSd3-f^O%73zlTr8}raM9cC86y4({>_-_v$**O1Z|U0iohT?Z6grA+l5` zvPB^A{PqfkYQT}@GUYw;cwyhW`K9eww3AIMHf{4XQ(O&FgB6?i>uG-=Phz9h8I>t! zI**fq!+SI(SD<^vlp7BSgvCmud>6R{VBC4NMuXw0Y*^kYt0L?W)W=A>X5TJHO@LvF zlPwg@l}5lI67aHri$K(hEE4xMWG_|4kJJjz(-yKZjF-t*w&KFi&&6;4_9K}9%p6U? zX7JAPRipAt!S7Fqy}lI-ZRe2lp>A$g<~yH}td4YNkRn@Z1b(7czS?0n6HOY#LWHO% zJMLhaN}`S3_Q7w{=h44WtM^0_VY9_=#;Q@@`*JxbHV|+F0^uwVp;LC;W2H0FGBEhe zWR0NhTZ_$QDKSHZ1f}C5_}zc?4f}(ubb^rZhtg7aL5|K2>rbD)glke?cX(4g*^V>C z{i2Hnp^hG^3H*RRzj4>j6h5c7olM%$DOb+*qB`^GPvq$X)PJ&eZhH4}H#-CgIiYnq zbtZW-e-?$Qt;BbNXN4=4HAb1rr{!jmELb|lRwp!^KIWpg z2O=*&UV-rLx5gIwHG_}7MRs*L)tC17oiJ2s6kX zl_9|NRiEzqCSk<5!H*i@?J|F9xb=H(KWUAXz4Qta4SM3p^{AyTm-H-PsDhn}m~~l? zWgN+6l$Er}V9PY1;xiL#t+!8nnY@v)QJ|@D1)99Mon}i~mOLYXV|Shi!K6|}>$cr) z%tsS+KmQSLnBl@tvh*BJj!k57xsN|`6bBi!B(tJWBuR%MA%E%S+Ua@gl&0ys)_5^u z#U1||mu5ZDtE?I!NftQcw+MwL;VwnmReH9=@%@y zE`jE!EjT;Uv3|@||I{dD`UIm$Yq|!lCF?PUWI}%+<#EOrEErX}ux)Ah1uvpmt>%7L zQbLeX2Ka*e^9>m}d6%x7@mo-D?x}z?DjHg@IX@50vFS}>U!PZ~I41GTA5suwTS1VN z`9{yR7t^~RkQ5UVv{=z)a4h2TQ!cDwOFX2 z(T=7I9T;E{rbg>{_IGV^RNAwujqc&i`X#xmf-Kt z;i^&OKfBBBWHy@l5Bk>T^S;*aQ7^UCVXQH#oVp8pjQ4svHX&CrSX6Yc9oszPYMxI1 zBBZ~0AchgPQaUiM-P=gz?|E%Dcm*nW8ns``={_UCVulV_S9N*vZ`iH65cz&}0Rmbx zoI*eU4O^+Ra=-hZQ8XJ=ahSL_#pH1~Ih8|8MVE6(l#ii&crj+Y&S)|M+B zRKp!TpDh$srtidp<3o-Hw3fBn1M($NU|xjrxoqjL69^)I1H1(gPoFT27sE<^M3hjr z5%^_0+YnrwoZOq^i{(kerM&KOE41erR&eE54;cF>7h7qnyYlgZlXi91gO6)5OXp1jz3xXJn+MnJ z9^-CFNsbrEM91er*rM0{jYSP-Z9KC1^LDYc*enPc@%s z3HdstS_ujYqGh!_h#P)W#RZ;JWN}X@N>q#fd_&^(s^{ofRi)=9-njE8Jg~hz5Lp&- z*jN9y-ojwPAfR_y(Z3h?AL{(kOu646#svCG)nOX10Uc3YL_ zm>$-KIsvQX2Sc<9_m59Ns@84K(Wj(MHfH`i+8Euy9V271$CJox1@0{Oyg9;M_oD!4 z7FD;-bm!87jHxUJr?Lj=14M=B5`*Yhix_$|A4)9w{PaGI_>%RkR=yQv%Y`CcFmb1| zR%LYc`Ha|eBs`47TnSRujsl<6EZSb_?kL2t@c|}qH4iPU9PmXm{i0W zPtARN!pVxW<@?>3ULkq)IPuo?A1rms&~Wfi))aaN#g;_PATu*lm*bgYnR@KdYM6S!u;WhGvloL1_%ODz1ZR;R&)@O1!^tcw4vV3E=2ky0D~- zkfk(a=kcQ^;*io2!u5g422k*s|DDjHPn~KmWbR6SXlh;LS$QE1lXNUxUf(N!`f`MC zC4?@F-_ZGzd)Rk5Qe^Nm#qd){}*dM&2SqUbz60 z9`D$2kLh$qwMz*x&!&xVP(->yeW~j7MUWs*Fb3Z~=ZC`tif(8(mny#Za@BrPx&vqR90O-%iE&Why*UTgpcOeS8Pi2vTa$g(C6DzNvZGS?zz4$CT*HRatTLp3r&X_!?sYo|huVKnZ*=mO_| zvU%qQF1~g}$KD^Ex_G(j#n`LB@w`}=>V_&*~5|K}UVyZajnSF<8p1UlIAKgDunBoxG}L=6J|AHGto AN&o-= literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s3_corner_m90.png b/examples/pcg_facade_tower/verify/renders/s3_corner_m90.png new file mode 100644 index 0000000000000000000000000000000000000000..6e7500ffa267b73acacc074ac0f0a89ef908ef65 GIT binary patch literal 89874 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 literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s3_corner_m90_plan.png b/examples/pcg_facade_tower/verify/renders/s3_corner_m90_plan.png new file mode 100644 index 0000000000000000000000000000000000000000..cd2ab37d57f6878e309380d9dd6ed1f7fd03faca GIT binary patch literal 33899 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 EKjRBlUjP6A literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s3_corner_p45.png b/examples/pcg_facade_tower/verify/renders/s3_corner_p45.png new file mode 100644 index 0000000000000000000000000000000000000000..ee29f24081dca935906c8c8c9b8c29e36524b5fd GIT binary patch literal 70644 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 literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s3_corner_p45_plan.png b/examples/pcg_facade_tower/verify/renders/s3_corner_p45_plan.png new file mode 100644 index 0000000000000000000000000000000000000000..25e98de191ae7088869887681519d5f6ef3f1123 GIT binary patch literal 37296 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 literal 0 HcmV?d00001 diff --git a/examples/pcg_facade_tower/verify/renders/s3_corner_p90.png b/examples/pcg_facade_tower/verify/renders/s3_corner_p90.png new file mode 100644 index 0000000000000000000000000000000000000000..e77d735d787cd7e23e014ca8c361766c11f82df7 GIT binary patch literal 90397 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