From d0f97bf79a2c77e5ce55828fde570945c87e2e62 Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Sun, 18 Oct 2026 21:29:52 +0200 Subject: [PATCH] wip(assembler): round S3 -- far ground from the native heightfield; LOD7/8 tiles 36-66% cheaper Far-shell repair (81-96% of S2's LOD7/8 tile time) is skipped for certified SurfaceWorld tiles; ground and cap come from the shared planar heightfield. Near LOD0-3 hashes equal S2; far recipe version 1 salts LOD5+ identities. Cold first view 6.6 -> 3.4 s (aim 1.57 s). Not a visual sign-off: distant cap shows floating pieces, sprint streaming arrives late. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ --- ARCHITECTURE.md | 31 ++ CODEMAP.md | 13 + .../Private/VoxelForgeExploreCommandlet.cpp | 264 +++++++++++- .../include/VoxelForgeCore/VoxelForgeCore.h | 16 + Standalone/Core/src/FarShellsInternal.h | 77 +++- Standalone/Core/src/VoxelForgeCore.cpp | 382 +++++++++++++++++- .../gpu_field_port/LUNA_DIALOGUE.md | 24 ++ .../WorldAssemblerM3/Round7/REPORT.md | 171 ++++++++ .../Round7/captures/after_s3_cap.jpg | Bin 0 -> 10785 bytes .../Round7/captures/after_s3_far.jpg | Bin 0 -> 17073 bytes .../Round7/captures/after_s3_surface.jpg | Bin 0 -> 16721 bytes .../Round7/captures/approach_00.jpg | Bin 0 -> 15252 bytes .../Round7/captures/approach_02.jpg | Bin 0 -> 4648 bytes .../Round7/captures/approach_04.jpg | Bin 0 -> 4648 bytes .../Round7/captures/approach_normal_00.jpg | Bin 0 -> 14036 bytes .../Round7/captures/approach_normal_01.jpg | Bin 0 -> 14462 bytes .../Round7/captures/approach_normal_02.jpg | Bin 0 -> 13677 bytes .../Round7/captures/approach_normal_03.jpg | Bin 0 -> 14260 bytes .../Round7/captures/approach_normal_04.jpg | Bin 0 -> 12981 bytes .../Round7/captures/before_s2_cap.jpg | Bin 0 -> 9341 bytes .../Round7/captures/before_s2_far.jpg | Bin 0 -> 16630 bytes .../Round7/captures/before_s2_surface.jpg | Bin 0 -> 16683 bytes .../Round7/captures/retreat_00.jpg | Bin 0 -> 16165 bytes .../Round7/captures/retreat_02.jpg | Bin 0 -> 12025 bytes .../Round7/captures/retreat_04.jpg | Bin 0 -> 6228 bytes Standalone/Source/StandaloneViewer.cpp | 28 ++ 26 files changed, 976 insertions(+), 30 deletions(-) create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/REPORT.md create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/after_s3_cap.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/after_s3_far.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/after_s3_surface.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/approach_00.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/approach_02.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/approach_04.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_00.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_01.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_02.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_03.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_04.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/before_s2_cap.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/before_s2_far.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/before_s2_surface.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/retreat_00.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/retreat_02.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Round7/captures/retreat_04.jpg diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 797d6ea..cceeb06 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1364,6 +1364,37 @@ Validation compares complete placement transforms and canonical anchor residuals clears an isolated populated HISM fixture under BuildHost null RHI. These CPU costs do not measure rendering or GPU upload. See the Round 6 report for results and limits. +### 8.24 Shared native far horizon — World Assembler M3 Round 7 + +The shared Core tile generator reads each family declaration from the immutable assembly snapshot. +`WorldAssemblyPlanV1::strates` declares SurfaceWorld ground and cap profiles through `Heightfield2D`; +`floatingIslands` declares bounded 3D features and has no planar ground/cap datum. This keeps the +horizon rule in the shared worker path while allowing each family to provide the shape it can prove. + +At LOD5 and above, an unedited SurfaceWorld tile builds its ground from the native heightfield on +a globally aligned 128-voxel grid, using the tile step below 128. The cap remains on the 128-voxel +grid so adjacent far levels share samples. Ground and cap are clipped to the tile-Z bounds and to +`cap >= ground`; shared ground vertices replace nearby upward-facing coarse MC ground triangles, +while existing ceiling seam skirts remain. At LOD7/8, a tile that intersects a native SurfaceWorld +profile but intersects no island plan skips the derived stratum/connector repair +shells: the exact native ground and cap already provide its exterior closure. Player-edited tiles +keep the real edited field and repair path at every visible LOD. Islands-only and mixed island tiles +keep the shared 3D field and far-shell path. + +For the 3D connector repair path, LOD7/8 use the same 256-voxel axial station/ring spacing. LOD6 and +nearer far-shell work retain 128-voxel stations. This reduces source-field probes while keeping a +continuous repair mesh at the resolution used by the far tile. It does not alter canonical density +arithmetic, feature order, water datum, `Epoch`, `ModsLock`, task ownership, collision policy, or the +Core-off legacy route. All horizon work runs on the resolved immutable worker snapshot. + +`TileGenerationStats` exposes classification, XY column, MC meshing, shell and horizon times, repair +field calls, skipped repairs and replaced ground triangles. `farHorizonVersion` is part of the tile +generation recipe and salts far mesh, payload and topology hashes at LOD5+; it does not salt density +or LOD0–LOD3 identities. Increase it when changing far geometry again. Round 7's staged owner checks +measure eight warmed keys per LOD and compare the shared LOD7/8 surface lattice against exact near-field +density roots, including a 100 cm datum-offset negative control. See +`Standalone/Research/WorldAssemblerM3/Round7/REPORT.md` for results and the visual evidence limits. + ## 9. Multiplayer model (listen-server first, dedicated-friendly) > **Status: transport is DESIGN ONLY — nothing is networked in-tree yet** (no `Replicated`/`HasAuthority`/RPCs; a diff --git a/CODEMAP.md b/CODEMAP.md index 910a505..ba9f4e7 100644 --- a/CODEMAP.md +++ b/CODEMAP.md @@ -966,6 +966,19 @@ Hard, and Interleaved transitions produce the same Core probe hash and are not f See the [round-4 coverage table and small matched captures](Standalone/UNREAL_INTEGRATION_REPORT.md) and [probe artifacts](Standalone/Research/OwnerShapeWorld/core_strate_coverage/). +World Assembler M3 Round 7 adds a shared far-horizon path. `WorldAssemblyPlanV1::strates` is the +SurfaceWorld declaration: `World::generateTile` evaluates native ground on a globally aligned grid +with step min(tile step, 128 voxels), and cap on the shared 128-voxel grid. It clips both surfaces +to the tile and to `cap >= ground`, and replaces nearby upward coarse-MC ground faces. An unedited +SurfaceWorld tile at LOD7/8 that intersects a native surface plan and no island plan uses those +profile surfaces instead of derived far stratum/connector repairs. Tiles with edits or intersecting +FloatingIslands plans keep the canonical field and repairs. FloatingIslands keeps the shared 3D field +and repair path, with a common 256-voxel axial station/ring grid at LOD7/8; closer LODs retain +128-voxel stations. `TileGenerationStats` reports classification, column, meshing, shell and horizon +time, repair field calls, skipped repairs and replaced triangles. `farHorizonVersion` salts far +mesh/payload/topology hashes only. The BuildHost commandlet owns warmed eight-key timings and the +exact-density-root LOD7/8 agreement audit with its datum-offset negative control. + ## 4. The density pipeline (most-edited hot path) ### 4.1 `GetDensityWithParams` (TunnelNetwork) — VoxelGenerator.cpp:3749 diff --git a/Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp b/Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp index f06511b..52bf2d3 100644 --- a/Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp +++ b/Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp @@ -15147,14 +15147,244 @@ bool RunCoreOffActorTest(const FExploreArguments& Arguments, FString& OutError) return true; } +bool RunCoreFarHorizonAgreementAudit(VoxelForgeCore::World& World, + const std::vector& Keys, + const VoxelForgeCore::WorldAssemblyManifest& Assembly,FString& OutError) +{ + constexpr std::int64_t SubvoxelsPerVoxel=VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel; + constexpr double ToleranceCm=2.0; + constexpr double NegativeDatumOffsetCm=100.0; + const double VoxelSizeCm=static_cast(World.configuration().voxelSizeMicrons)/10000.0; + using FXYKey=std::pair; + struct FGroundVertices { std::map> ByXY; }; + const auto GatherGroundVertices=[&](const VoxelForgeCore::TileMesh& Mesh) + { + FGroundVertices Out; + constexpr std::int64_t GridPeriod=128*SubvoxelsPerVoxel; + for(const VoxelForgeCore::MeshVertex& Vertex:Mesh.vertices) + { + if(Vertex.normal.z<0.35)continue; + const auto X=static_cast(std::llround( + Vertex.position.x/VoxelSizeCm*SubvoxelsPerVoxel)); + const auto Y=static_cast(std::llround( + Vertex.position.y/VoxelSizeCm*SubvoxelsPerVoxel)); + if(X%GridPeriod!=0||Y%GridPeriod!=0)continue; + const auto Z=static_cast(std::llround( + Vertex.position.z/VoxelSizeCm*SubvoxelsPerVoxel)); + Out.ByXY[{X,Y}].push_back(Z); + } + return Out; + }; + const auto TileBounds=[](const VoxelForgeCore::TileKey& Key) + { + const std::int64_t Extent=static_cast(32)<(Key.coordinate.x)*Extent; + const std::int64_t Y=static_cast(Key.coordinate.y)*Extent; + const std::int64_t Z=static_cast(Key.coordinate.z)*Extent; + return std::array{X,Y,Z,X+Extent,Y+Extent,Z+Extent}; + }; + struct FSample { std::int64_t X=0,Y=0,ProfileGround=0,Far7=0,Far8=0; }; + std::vector Samples; + std::string CoreError; + VoxelForgeCore::TileGenerationOptions Options; + Options.hashDensity=true; + for(const auto& Key7:Keys) + { + if(Key7.lod!=7)continue; + const auto Bounds7=TileBounds(Key7); + for(const auto& Key8:Keys) + { + if(Key8.lod!=8)continue; + const auto Bounds8=TileBounds(Key8); + bool bTouches=true; + for(int Axis=0;Axis<3;++Axis) + bTouches=bTouches&&Bounds7[Axis]<=Bounds8[Axis+3]&&Bounds8[Axis]<=Bounds7[Axis+3]; + if(!bTouches)continue; + const auto Mesh7=World.generateTile(Key7,Options,CoreError); + const auto Mesh8=World.generateTile(Key8,Options,CoreError); + if(!Mesh7||!Mesh8) + { + OutError=FString::Printf(TEXT("Far-horizon agreement tile generation failed: %s"), + UTF8_TO_TCHAR(CoreError.c_str())); + return false; + } + const FGroundVertices Ground7=GatherGroundVertices(*Mesh7); + const FGroundVertices Ground8=GatherGroundVertices(*Mesh8); + std::vector PairSamples; + for(const auto& Plan:Assembly.plan.strates) + { + const VoxelForgeCore::Heightfield2D Field(Assembly.recipe,Plan); + if(!Field.isValid())continue; + for(const auto& Pair:Ground7.ByXY) + { + const auto Other=Ground8.ByXY.find(Pair.first); + if(Other==Ground8.ByXY.end())continue; + const auto Column=Field.point(Pair.first.first,Pair.first.second,0); + const std::int64_t Ground=Column.groundHeightSubvoxels; + const std::int64_t Cap=Column.capHeightSubvoxels; + if(Ground>=Cap)continue; + const double GroundVoxel=static_cast(Ground)/SubvoxelsPerVoxel; + if(GroundVoxelBounds7[5] + ||GroundVoxelBounds8[5])continue; + const auto Nearest=[Ground](const std::vector& Values) + ->std::optional + { + if(Values.empty())return std::nullopt; + return *std::min_element(Values.begin(),Values.end(),[Ground](auto A,auto B) + {return std::abs(A-Ground)second); + if(Z7&&Z8)PairSamples.push_back({Pair.first.first,Pair.first.second,Ground,*Z7,*Z8}); + } + if(PairSamples.size()>=64)break; + } + if(PairSamples.size()>Samples.size())Samples=std::move(PairSamples); + if(Samples.size()>=64)break; + } + if(Samples.size()>=64)break; + } + bool bUsedWalkRouteGrid=false; + if(Samples.size()<64) + { + Samples.clear(); + for(const auto& Plan:Assembly.plan.strates) + { + const VoxelForgeCore::Heightfield2D Field(Assembly.recipe,Plan); + if(!Field.isValid())continue; + std::int64_t RouteXSub=0,RouteYSub=0; + if(!Plan.route.empty()) + { + RouteXSub=Plan.route.front().positionSubvoxels[0]; + RouteYSub=Plan.route.front().positionSubvoxels[1]; + } + constexpr std::int64_t GridPeriod=128*SubvoxelsPerVoxel; + const std::int64_t XSub=static_cast(std::llround( + static_cast(RouteXSub)/GridPeriod))*GridPeriod; + const std::int64_t YSub=static_cast(std::llround( + static_cast(RouteYSub)/GridPeriod))*GridPeriod; + const auto WalkColumn=Field.point(XSub,YSub,0); + if(WalkColumn.groundHeightSubvoxels>=WalkColumn.capHeightSubvoxels)continue; + const std::int64_t XVoxel=XSub/SubvoxelsPerVoxel,YVoxel=YSub/SubvoxelsPerVoxel; + const std::int64_t WalkGroundVoxel=WalkColumn.groundHeightSubvoxels/SubvoxelsPerVoxel; + const auto MakeKey=[](std::int64_t X,std::int64_t Y,std::int64_t Z,std::int64_t Extent,int32 LOD) + { + VoxelForgeCore::TileKey Key; + Key.coordinate={static_cast(std::floor(static_cast(X)/Extent)), + static_cast(std::floor(static_cast(Y)/Extent)), + static_cast(std::floor(static_cast(Z)/Extent))}; + Key.lod=LOD; + return Key; + }; + const VoxelForgeCore::TileKey Key7=MakeKey(XVoxel,YVoxel,WalkGroundVoxel,4096,7); + const VoxelForgeCore::TileKey Key8=MakeKey(XVoxel,YVoxel,WalkGroundVoxel,8192,8); + const auto Mesh7=World.generateTile(Key7,Options,CoreError); + const auto Mesh8=World.generateTile(Key8,Options,CoreError); + if(!Mesh7||!Mesh8) + { + OutError=FString::Printf(TEXT("Walk-route far-horizon tile generation failed: %s"), + UTF8_TO_TCHAR(CoreError.c_str())); + return false; + } + const FGroundVertices Ground7=GatherGroundVertices(*Mesh7); + const FGroundVertices Ground8=GatherGroundVertices(*Mesh8); + for(const auto& Pair:Ground7.ByXY) + { + const auto Other=Ground8.ByXY.find(Pair.first); + if(Other==Ground8.ByXY.end())continue; + const auto Column=Field.point(Pair.first.first,Pair.first.second,0); + const std::int64_t Ground=Column.groundHeightSubvoxels; + if(Ground>=Column.capHeightSubvoxels)continue; + const auto Bounds7=TileBounds(Key7),Bounds8=TileBounds(Key8); + const double GroundVoxel=static_cast(Ground)/SubvoxelsPerVoxel; + if(GroundVoxelBounds7[5] + ||GroundVoxelBounds8[5])continue; + const auto Nearest=[Ground](const std::vector& Values) + ->std::optional + { + if(Values.empty())return std::nullopt; + return *std::min_element(Values.begin(),Values.end(),[Ground](auto A,auto B) + {return std::abs(A-Ground)second); + if(Z7&&Z8) + Samples.push_back({Pair.first.first,Pair.first.second,Ground,*Z7,*Z8}); + if(Samples.size()>=256)break; + } + if(Samples.size()>=64){bUsedWalkRouteGrid=true;break;} + Samples.clear(); + } + } + if(Samples.size()<64) + {OutError=TEXT("Far-horizon agreement audit found fewer than 64 shared LOD7/8 surface points around the staged walk route.");return false;} + + const auto FindNearRoot=[&](std::int64_t XSub,std::int64_t YSub,double GroundVoxel,double& OutVoxel) + { + const double X=static_cast(XSub)/SubvoxelsPerVoxel; + const double Y=static_cast(YSub)/SubvoxelsPerVoxel; + for(double Radius=4.0;Radius<=4096.0;Radius*=2.0) + { + double Lo=GroundVoxel-Radius,Hi=GroundVoxel+Radius; + if(!(World.densityAt({X,Y,Lo})<0.0f&&World.densityAt({X,Y,Hi})>=0.0f))continue; + for(int Iteration=0;Iteration<14;++Iteration) + { + const double Mid=(Lo+Hi)*0.5; + if(World.densityAt({X,Y,Mid})<0.0f)Lo=Mid;else Hi=Mid; + } + OutVoxel=(Lo+Hi)*0.5; + return true; + } + return false; + }; + double MaximumFar7ErrorCm=0.0,MaximumFar8ErrorCm=0.0,MaximumCrossLodErrorCm=0.0; + double MaximumNegativeControlErrorCm=0.0; + std::size_t Compared=0; + const std::size_t SampleStride=std::max(1,(Samples.size()+127)/128); + for(std::size_t Index=0;Index(Sample.ProfileGround)/SubvoxelsPerVoxel,NearVoxel))continue; + const double Far7Cm=static_cast(Sample.Far7)/SubvoxelsPerVoxel*VoxelSizeCm; + const double Far8Cm=static_cast(Sample.Far8)/SubvoxelsPerVoxel*VoxelSizeCm; + const double NearCm=NearVoxel*VoxelSizeCm; + MaximumFar7ErrorCm=std::max(MaximumFar7ErrorCm,std::abs(Far7Cm-NearCm)); + MaximumFar8ErrorCm=std::max(MaximumFar8ErrorCm,std::abs(Far8Cm-NearCm)); + MaximumCrossLodErrorCm=std::max(MaximumCrossLodErrorCm,std::abs(Far7Cm-Far8Cm)); + MaximumNegativeControlErrorCm=std::max(MaximumNegativeControlErrorCm, + std::abs((Far8Cm+NegativeDatumOffsetCm)-NearCm)); + ++Compared; + } + const bool bNegativeControlDetected=Compared>0&&MaximumNegativeControlErrorCm>ToleranceCm; + if(Compared<32||MaximumFar7ErrorCm>ToleranceCm||MaximumFar8ErrorCm>ToleranceCm + ||MaximumCrossLodErrorCm>ToleranceCm||!bNegativeControlDetected) + { + OutError=FString::Printf(TEXT("Far-horizon agreement failed: points=%llu far7_cm=%.4f far8_cm=%.4f cross_lod_cm=%.4f tolerance_cm=%.2f negative_control_cm=%.4f detected=%d."), + static_cast(Compared),MaximumFar7ErrorCm,MaximumFar8ErrorCm, + MaximumCrossLodErrorCm,ToleranceCm,MaximumNegativeControlErrorCm,bNegativeControlDetected?1:0); + return false; + } + UE_LOG(LogTemp,Display, + TEXT("[VoxelForgeFarHorizonAgreement] status=PASS lod_pair=7/8 shared_points=%llu source=%s max_far7_near_cm=%.4f max_far8_near_cm=%.4f max_cross_lod_cm=%.4f tolerance_cm=%.2f near_source=exact_density_root negative_control=100cm_datum_offset max_error_cm=%.4f detected=1"), + static_cast(Compared), + bUsedWalkRouteGrid?TEXT("staged_walk_route_grid"):TEXT("desired_tile_overlap"), + MaximumFar7ErrorCm,MaximumFar8ErrorCm,MaximumCrossLodErrorCm, + ToleranceCm,MaximumNegativeControlErrorCm); + return true; +} + // Paired engine timings include preparation and derived shells, with canonical output hashes. // Mesures moteur appariees : preparation et coques derivees incluses, avec hashes canoniques. bool RunCoreSharedFeatureCostAudit(VoxelForgeCore::World& World, - const std::vector& Keys,const TCHAR* Label,FString& OutError) + const std::vector& Keys,const TCHAR* Label, + const VoxelForgeCore::WorldAssemblyManifest* Assembly,FString& OutError) { for (const int32 LOD : {0,1,7,8}) { TArray FullTimes,CandidateTimes,FullShellTimes,CandidateShellTimes,ListTimes; + TArray UnknownBoxes,FieldCalls,ColumnMisses,StratumShellTimes,ConnectorShellTimes; + TArray ClassificationTimes,ColumnComputeTimes,MeshingTimes,HorizonTimes,RepairSkipped; + TArray StratumFieldCalls,ConnectorFieldCalls,ShellTriangles,GroundTriangles,GroundRemoved,CapTriangles; for (const auto& Key : Keys) { if (Key.lod!=LOD || FullTimes.Num()>=8) continue; @@ -15182,15 +15412,37 @@ bool RunCoreSharedFeatureCostAudit(VoxelForgeCore::World& World, FullShellTimes.Add(Full->diagnostics.farShellMilliseconds); CandidateShellTimes.Add(Candidate->diagnostics.farShellMilliseconds); ListTimes.Add(Candidate->diagnostics.featureListMilliseconds); + UnknownBoxes.Add(static_cast(Full->diagnostics.unknownBoxes)); + FieldCalls.Add(static_cast(Full->diagnostics.fieldCalls)); + ColumnMisses.Add(static_cast(Full->diagnostics.columnCacheMisses)); + ClassificationTimes.Add(Full->diagnostics.classificationMilliseconds); + ColumnComputeTimes.Add(Full->diagnostics.columnComputeMilliseconds); + MeshingTimes.Add(Full->diagnostics.meshingMilliseconds); + HorizonTimes.Add(Full->diagnostics.farHorizonMilliseconds); + RepairSkipped.Add(Full->diagnostics.farShellRepairSkipped?1.0:0.0); + StratumShellTimes.Add(Full->diagnostics.farStratumShellMilliseconds); + ConnectorShellTimes.Add(Full->diagnostics.farConnectorShellMilliseconds); + StratumFieldCalls.Add(static_cast(Full->diagnostics.farStratumFieldCalls)); + ConnectorFieldCalls.Add(static_cast(Full->diagnostics.farConnectorFieldCalls)); + ShellTriangles.Add(static_cast(Full->diagnostics.farShellTrianglesAdded)); + GroundTriangles.Add(static_cast(Full->diagnostics.horizonGroundTriangles)); + GroundRemoved.Add(static_cast(Full->diagnostics.horizonGroundTrianglesRemoved)); + CapTriangles.Add(static_cast(Full->diagnostics.horizonCapTriangles)); } const auto P95=[](TArray Values) { Values.Sort(); return Values.IsEmpty() ? 0.0 : Values[FMath::Clamp( FMath::CeilToInt(Values.Num()*0.95f)-1,0,Values.Num()-1)]; }; UE_LOG(LogTemp,Display, - TEXT("[VoxelForgeSharedFeatureCost] label=%s lod=%d tiles=%d hashes_identical=1 full_p95_ms=%.5f candidate_p95_ms=%.5f list_p95_ms=%.5f full_shell_p95_ms=%.5f candidate_shell_p95_ms=%.5f"), + TEXT("[VoxelForgeSharedFeatureCost] label=%s lod=%d tiles=%d hashes_identical=1 full_p95_ms=%.5f candidate_p95_ms=%.5f list_p95_ms=%.5f classification_p95_ms=%.5f column_compute_p95_ms=%.5f meshing_p95_ms=%.5f horizon_p95_ms=%.5f full_shell_p95_ms=%.5f candidate_shell_p95_ms=%.5f repair_skipped_p95=%.0f unknown_boxes_p95=%.0f field_calls_p95=%.0f column_misses_p95=%.0f stratum_shell_p95_ms=%.5f stratum_field_calls_p95=%.0f connector_shell_p95_ms=%.5f connector_field_calls_p95=%.0f shell_triangles_p95=%.0f horizon_ground_triangles_p95=%.0f horizon_ground_removed_p95=%.0f horizon_cap_triangles_p95=%.0f"), Label,LOD,FullTimes.Num(),P95(FullTimes),P95(CandidateTimes),P95(ListTimes), - P95(FullShellTimes),P95(CandidateShellTimes)); + P95(ClassificationTimes),P95(ColumnComputeTimes),P95(MeshingTimes),P95(HorizonTimes), + P95(FullShellTimes),P95(CandidateShellTimes),P95(RepairSkipped),P95(UnknownBoxes),P95(FieldCalls), + P95(ColumnMisses),P95(StratumShellTimes),P95(StratumFieldCalls), + P95(ConnectorShellTimes),P95(ConnectorFieldCalls),P95(ShellTriangles), + P95(GroundTriangles),P95(GroundRemoved),P95(CapTriangles)); } + if(Assembly!=nullptr&&!Assembly->plan.strates.empty() + &&!RunCoreFarHorizonAgreementAudit(World,Keys,*Assembly,OutError))return false; return true; } @@ -15429,7 +15681,8 @@ bool RunCoreFloatingIslandActorIntegrationTest( return false; } ReferenceWorld.retainTileRegions(Desired); - if (!RunCoreSharedFeatureCostAudit(ReferenceWorld,Desired,TEXT("islands"),OutError)) return false; + if (!RunCoreSharedFeatureCostAudit(ReferenceWorld,Desired,TEXT("islands"), + &NativeAssembly,OutError)) return false; VoxelForgeCore::TileGenerationOptions Options; Options.hashDensity = true; std::vector AggregateRows; @@ -16838,7 +17091,8 @@ bool RunCoreWorldActorIntegrationTest(const FExploreArguments& Arguments, FStrin return true; } - if (!RunCoreSharedFeatureCostAudit(ReferenceWorld,Desired,TEXT("surface"),OutError)) return false; + if (!RunCoreSharedFeatureCostAudit(ReferenceWorld,Desired,TEXT("surface"), + Assembly,OutError)) return false; if (FParse::Param(FCommandLine::Get(),TEXT("corefeatureauditonly"))) { UE_LOG(LogTemp,Display,TEXT("[VoxelForgeSharedFeatureCost] pass complete=1 warmed_routes=1")); diff --git a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h index 3a27951..e67acac 100644 --- a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +++ b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h @@ -128,6 +128,17 @@ namespace VoxelForgeCore double meshingMilliseconds = 0.0; double featureListMilliseconds = 0.0; double farShellMilliseconds = 0.0; + double farStratumShellMilliseconds = 0.0; + double farConnectorShellMilliseconds = 0.0; + double farHorizonMilliseconds = 0.0; + std::uint64_t farStratumFieldCalls = 0; + std::uint64_t farConnectorFieldCalls = 0; + std::uint64_t farShellTrianglesAdded = 0; + std::uint64_t horizonGroundTriangles = 0; + std::uint64_t horizonGroundTrianglesRemoved = 0; + std::uint64_t horizonCapTriangles = 0; + std::uint32_t farHorizonVersion = 0; + bool farShellRepairSkipped = false; bool tileWasClassified = false; bool meshingSkipped = false; bool featureRefinedResolution = false; @@ -984,6 +995,11 @@ namespace VoxelForgeCore // Validation control only; never participates in recipe/world identity. // Controle de validation seulement, sans effet sur l'identite du monde. bool useAssemblyFeatureQueries = true; + // Bump when the far-horizon mesh representation changes. Far tile mesh hashes are + // salted with this version; density and LOD0-3 hashes are intentionally unchanged. + // Incremente quand la representation d'horizon lointain change; les hashes de maillage + // lointain incluent cette version, sans toucher a la densite ni aux LOD0-3. + std::uint32_t farHorizonVersion = 1; }; class VFCORE_API World diff --git a/Standalone/Core/src/FarShellsInternal.h b/Standalone/Core/src/FarShellsInternal.h index 37169e4..da08747 100644 --- a/Standalone/Core/src/FarShellsInternal.h +++ b/Standalone/Core/src/FarShellsInternal.h @@ -311,7 +311,10 @@ inline void AppendFarConnectorShells(const FStandaloneShapeWorld& Shape,const FV if(TMin>TMax){bIntersects=false;break;} } if(!bIntersects||TMax-TMin<1.0e-6)continue; - const int32 AxialSampleCount=std::max(1,static_cast(std::ceil(Length/128.0))); + // LOD7 and LOD8 share a 256-voxel connector station grid; near LOD keeps 128-voxel checks. + // LOD7 et LOD8 partagent des stations aux 256 voxels; pres du joueur, garder les pas de 128. + const double ConnectorStationStep=Key.Level>=7?std::max(256.0,static_cast(Step)):128.0; + const int32 AxialSampleCount=std::max(1,static_cast(std::ceil(Length/ConnectorStationStep))); std::vector MissingMasks(static_cast(AxialSampleCount),0); std::vector> SourceRadii(static_cast(AxialSampleCount)); for(auto& Radii:SourceRadii)Radii.fill(0.0); @@ -429,7 +432,7 @@ inline void AppendFarConnectorShells(const FStandaloneShapeWorld& Shape,const FV } } std::vector Rings; - const double MaxRingStep=128.0; + const double MaxRingStep=Key.Level>=7?std::max(256.0,static_cast(Step)):128.0; double CurrentT=RunMin; Rings.push_back(MakeRing(CurrentT,RunStart,RunEnd,RunRadiusMask)); while(CurrentT FindFarStratumCrossings(const FStandaloneShapeWorld& return Crossings; } +inline bool FindNearestFarStratumCrossing(const FStandaloneShapeWorld& Shape, + double X,double Y,double ZMin,double ZMax,double Prediction,double& OutCrossing) +{ + if(ZMax<=ZMin||!std::isfinite(Prediction))return false; + const int32 Center=std::clamp(static_cast(std::floor(Prediction)), + static_cast(std::ceil(ZMin)),static_cast(std::floor(ZMax))); + double PreviousLeft=Center,PreviousRight=Center; + bool PreviousLeftSolid=Shape.DensityAt(static_cast(X),static_cast(Y), + static_cast(PreviousLeft))<0.0f; + bool PreviousRightSolid=PreviousLeftSolid; + const int32 MaximumRadius=std::max(Center-static_cast(std::floor(ZMin)), + static_cast(std::ceil(ZMax))-Center)+1; + for(int32 Radius=1;Radius<=MaximumRadius;++Radius) + { + bool bFound=false; + double Best=0.0,BestDistance=std::numeric_limits::infinity(); + const auto CheckBracket=[&](double A,double B,bool ASolid) + { + double Lo=std::min(A,B),Hi=std::max(A,B); + for(int32 I=0;I<6;++I) + { + const double Mid=(Lo+Hi)*0.5; + if((Shape.DensityAt(static_cast(X),static_cast(Y), + static_cast(Mid))<0.0f)==ASolid) + { + if(A(Center-Radius)); + if(Left(X),static_cast(Y), + static_cast(Left))<0.0f; + if(LeftSolid!=PreviousLeftSolid)CheckBracket(Left,PreviousLeft,LeftSolid); + PreviousLeft=Left;PreviousLeftSolid=LeftSolid; + } + const double Right=std::min(ZMax,static_cast(Center+Radius)); + if(Right>PreviousRight+1.0e-9) + { + const bool RightSolid=Shape.DensityAt(static_cast(X),static_cast(Y), + static_cast(Right))<0.0f; + if(RightSolid!=PreviousRightSolid)CheckBracket(PreviousRight,Right,PreviousRightSolid); + PreviousRight=Right;PreviousRightSolid=RightSolid; + } + if(bFound) + {OutCrossing=Best;return true;} + if(Left<=ZMin+1.0e-9&&Right>=ZMax-1.0e-9)break; + } + return false; +} + inline void AppendFarStratumShells(const FStandaloneOwnerWorld& World,const FStandaloneShapeWorld& Shape, const FVoxelTileKey& Key,int32 Step,FVoxelMeshData& Mesh) { @@ -992,12 +1056,9 @@ inline void AppendFarStratumShells(const FStandaloneOwnerWorld& World,const FSta Vertex.X=X0+(X1-X0)*static_cast(PX)/PatchDivisions; Vertex.Y=Y0+(Y1-Y0)*static_cast(PY)/PatchDivisions; const double PredictedZ=SurfaceZ(Vertex.X,Vertex.Y); - const std::vector Crossings=FindFarStratumCrossings( - Shape,Vertex.X,Vertex.Y,ZMin,ZMax); - if(Crossings.empty()){bValidPatch=false;break;} - Vertex.Z=*std::min_element(Crossings.begin(),Crossings.end(), - [PredictedZ](double A,double B) - {return std::abs(A-PredictedZ)=0.0f; } + std::uint64_t SaltFarHorizonHash(std::uint64_t Hash,std::uint32_t Version) + { + AddWord(Hash,0x464152484f52495aull,8); + AddWord(Hash,Version,4); + return Hash; + } + FStandaloneShapeWorld::EDetailVariant ToNative(DetailVariant value) { switch(value) @@ -226,6 +233,7 @@ namespace VoxelForgeCore double YSub = 0.0; double ZSub = 0.0; double GroundSub = 0.0; + double CapSub = 0.0; FVector Normal = FVector(0.0,0.0,-1.0); FColor Color = FColor::White; }; @@ -234,6 +242,7 @@ namespace VoxelForgeCore { std::uint64_t Cells = 0; std::uint64_t Triangles = 0; + std::uint64_t RemovedTriangles = 0; bool Refined = false; }; @@ -252,6 +261,7 @@ namespace VoxelForgeCore Out.YSub=A.YSub+(B.YSub-A.YSub)*T; Out.ZSub=A.ZSub+(B.ZSub-A.ZSub)*T; Out.GroundSub=A.GroundSub+(B.GroundSub-A.GroundSub)*T; + Out.CapSub=A.CapSub+(B.CapSub-A.CapSub)*T; Out.Normal=NormalizeCapNormal(A.Normal+(B.Normal-A.Normal)*T); const auto LerpByte=[T](uint8 AValue,uint8 BValue) {return static_cast(std::clamp(std::lround(AValue+(BValue-AValue)*T),0l,255l));}; @@ -287,11 +297,286 @@ namespace VoxelForgeCore return OutputCount; } - FNativeCapRefinementStats RefineLod8NativeCap(const FStandaloneOwnerWorld& Owner, + FNativeCapRefinementStats RefineFarNativeGround(const FStandaloneOwnerWorld& Owner, const WorldAssemblyManifest& Manifest,const FVoxelTileKey& Key,FVoxelMeshData& Mesh) { FNativeCapRefinementStats Stats; - if(Key.Level<8||!Owner.Generator)return Stats; + if(Key.Level<5||!Owner.Generator)return Stats; + const int32 GridStepVoxels=std::min(128,1<(GridStepVoxels)*Scale; + const FIntVector TileOrigin=Key.OriginVoxels(); + const int32 TileExtent=Key.ExtentVoxels(); + if(TileExtent<=0||TileExtent%GridStepVoxels!=0)return Stats; + const int32 Cells=TileExtent/GridStepVoxels; + const double TileMinZ=static_cast(TileOrigin.Z)*Scale; + const double TileMaxZ=static_cast(TileOrigin.Z+TileExtent)*Scale; + const int32 OldSurfaceVertices=std::clamp(Mesh.NumSurfaceVertices,0,Mesh.Vertices.Num()); + const bool bHasUVs=Mesh.UVs.Num()==Mesh.Vertices.Num(); + const bool bHasColors=Mesh.Colors.Num()==Mesh.Vertices.Num(); + std::vector AddedVertices,AddedNormals; + std::vector AddedUVs; + std::vector AddedColors; + std::vector AddedTriangles; + const int32 OldCeilingTriangleCount=std::max(0,Mesh.NumCeilingTriangles); + const int32 OldCeilingStart=std::max(0,Mesh.Triangles.Num()-OldCeilingTriangleCount*3); + + struct FGroundProfile + { + int32 Cells=0,GridStep=0; + double MinimumZ=0.0,MaximumZ=0.0; + std::vector Ground,Cap; + }; + std::vector GroundProfiles; + + for(const auto& Plan:Manifest.plan.strates) + { + const int64 StratumMinZ=static_cast(Plan.bottomChunkZ)*CHUNK_SIZE*Scale; + const int64 StratumMaxZ=(static_cast(Plan.topChunkZ)+1)*CHUNK_SIZE*Scale; + if(TileMaxZStratumMaxZ)continue; + const VoxelForgeCore::Heightfield2D Block(Manifest.recipe,Plan); + if(!Block.isValid())continue; + struct FGridSample + { + double Ground=0.0,Cap=0.0; + FVector Normal=FVector(0.0,0.0,1.0); + FColor Color=FColor::White; + int32 VertexIndex=INDEX_NONE; + }; + std::vector Grid(static_cast(Cells+1)*(Cells+1)); + const auto GridIndex=[Cells](int32 X,int32 Y) + {return static_cast(Y)*(Cells+1)+X;}; + for(int32 Y=0;Y<=Cells;++Y) + for(int32 X=0;X<=Cells;++X) + { + const int64 XSub=(static_cast(TileOrigin.X)+static_cast(X)*GridStepVoxels)*Scale; + const int64 YSub=(static_cast(TileOrigin.Y)+static_cast(Y)*GridStepVoxels)*Scale; + const auto Column=Block.point(XSub,YSub,0); + auto& Sample=Grid[GridIndex(X,Y)]; + Sample.Ground=static_cast(Column.groundHeightSubvoxels); + Sample.Cap=static_cast(Column.capHeightSubvoxels); + int32 Dominant=0,Neighbor=0;float Blend=0.0f; + Owner.Generator->GetBiomeMaterialAt(static_cast(XSub)/Scale, + static_cast(YSub)/Scale,static_cast(Sample.Ground/Scale), + Dominant,Neighbor,Blend); + Sample.Color=FColor(static_cast(std::clamp(Dominant,0,255)),0, + static_cast(std::clamp(std::lround(Blend*255.0f),0l,255l)), + static_cast(std::clamp(Neighbor,0,255))); + } + for(int32 Y=0;Y<=Cells;++Y) + for(int32 X=0;X<=Cells;++X) + { + const int32 Left=std::max(0,X-1),Right=std::min(Cells,X+1); + const int32 Down=std::max(0,Y-1),Up=std::min(Cells,Y+1); + const double DX=static_cast(Right-Left)*GridStepSubvoxels; + const double DY=static_cast(Up-Down)*GridStepSubvoxels; + const double SlopeX=DX>0.0?(Grid[GridIndex(Right,Y)].Ground + -Grid[GridIndex(Left,Y)].Ground)/DX:0.0; + const double SlopeY=DY>0.0?(Grid[GridIndex(X,Up)].Ground + -Grid[GridIndex(X,Down)].Ground)/DY:0.0; + auto& Sample=Grid[GridIndex(X,Y)]; + Sample.Normal=NormalizeCapNormal(FVector(-SlopeX,-SlopeY,1.0)); + Sample.Color.G=static_cast(std::clamp( + std::lround((1.0-std::abs(Sample.Normal.Z))*255.0),0l,255l)); + } + + FGroundProfile Profile; + Profile.Cells=Cells;Profile.GridStep=GridStepVoxels; + Profile.MinimumZ=static_cast(std::min(Plan.bottomChunkZ,Plan.topChunkZ))*CHUNK_SIZE; + Profile.MaximumZ=static_cast(std::max(Plan.bottomChunkZ,Plan.topChunkZ)+1)*CHUNK_SIZE; + Profile.Ground.reserve(Grid.size());Profile.Cap.reserve(Grid.size()); + for(const auto& Sample:Grid) + {Profile.Ground.push_back(Sample.Ground/Scale);Profile.Cap.push_back(Sample.Cap/Scale);} + GroundProfiles.push_back(std::move(Profile)); + + // Partager les sommets du profil entre cellules reduit le payload d'horizon. + // Share regular profile vertices across adjacent cells to bound horizon payload. + for(int32 Y=0;Y<=Cells;++Y) + for(int32 X=0;X<=Cells;++X) + { + auto& Sample=Grid[GridIndex(X,Y)]; + if(Sample.Ground>=Sample.Cap||Sample.GroundTileMaxZ)continue; + const int64 XSub=(static_cast(TileOrigin.X)+static_cast(X)*GridStepVoxels)*Scale; + const int64 YSub=(static_cast(TileOrigin.Y)+static_cast(Y)*GridStepVoxels)*Scale; + const double VoxelSizeCm=static_cast(Owner.CoreVoxelSizeMicrons)/10000.0; + Sample.VertexIndex=static_cast(AddedVertices.size()); + AddedVertices.emplace_back(static_cast(TileOrigin.X+X*GridStepVoxels)*VoxelSizeCm, + static_cast(TileOrigin.Y+Y*GridStepVoxels)*VoxelSizeCm, + Sample.Ground/Scale*VoxelSizeCm); + AddedNormals.push_back(Sample.Normal); + if(bHasUVs)AddedUVs.emplace_back(static_cast(XSub/Scale),static_cast(YSub/Scale)); + if(bHasColors)AddedColors.push_back(Sample.Color); + } + + for(int32 Y=0;Y GridVertices{}; + bool bCompleteCell=true; + for(int32 Corner=0;Corner<4;++Corner) + { + GridVertices[Corner]=Grid[GridIndex(CellX[Corner],CellY[Corner])].VertexIndex; + bCompleteCell=bCompleteCell&&GridVertices[Corner]!=INDEX_NONE; + } + if(bCompleteCell) + { + AddedTriangles.insert(AddedTriangles.end(),{GridVertices[0],GridVertices[1],GridVertices[2], + GridVertices[0],GridVertices[2],GridVertices[3]}); + ++Stats.Cells;Stats.Triangles+=2; + continue; + } + std::array PolygonA{},PolygonB{}; + for(int32 Corner=0;Corner<4;++Corner) + { + const int32 GX=CellX[Corner],GY=CellY[Corner]; + const auto& Sample=Grid[GridIndex(GX,GY)]; + PolygonA[Corner].XSub=static_cast(TileOrigin.X+GX*GridStepVoxels)*Scale; + PolygonA[Corner].YSub=static_cast(TileOrigin.Y+GY*GridStepVoxels)*Scale; + PolygonA[Corner].GroundSub=Sample.Ground; + PolygonA[Corner].CapSub=Sample.Cap; + PolygonA[Corner].ZSub=Sample.Ground; + PolygonA[Corner].Normal=Sample.Normal; + PolygonA[Corner].Color=Sample.Color; + } + int32 Count=ClipNativeCapPolygon(PolygonA.data(),4,PolygonB.data(), + [](const auto& V){return V.CapSub-V.ZSub;}); + Count=ClipNativeCapPolygon(PolygonB.data(),Count,PolygonA.data(), + [TileMinZ](const auto& V){return V.ZSub-TileMinZ;}); + Count=ClipNativeCapPolygon(PolygonA.data(),Count,PolygonB.data(), + [TileMaxZ](const auto& V){return TileMaxZ-V.ZSub;}); + if(Count<3)continue; + double TwiceArea=0.0; + for(int32 I=0;I(AddedVertices.size()); + for(int32 I=0;I(Owner.CoreVoxelSizeMicrons)/10000.0; + AddedVertices.emplace_back(V.XSub/Scale*VoxelSizeCm, + V.YSub/Scale*VoxelSizeCm,V.ZSub/Scale*VoxelSizeCm); + AddedNormals.push_back(V.Normal); + if(bHasUVs)AddedUVs.emplace_back(static_cast(V.XSub/Scale), + static_cast(V.YSub/Scale)); + if(bHasColors)AddedColors.push_back(V.Color); + } + for(int32 Fan=1;Fan+1(Owner.CoreVoxelSizeMicrons)/10000.0; + const int32 OldSurfaceTriangleCount=OldCeilingStart/3; + std::vector RemoveOldGround(static_cast(OldSurfaceTriangleCount),0); + const TArray& ExistingMasks=Mesh.TriangleSkirtFaceMasks; + const auto InterpolateProfile=[](const std::vector& Values,const FGroundProfile& Profile, + double LocalX,double LocalY) + { + const double GridX=std::clamp(LocalX/Profile.GridStep,0.0,static_cast(Profile.Cells)); + const double GridY=std::clamp(LocalY/Profile.GridStep,0.0,static_cast(Profile.Cells)); + const int32 X=std::min(Profile.Cells-1,static_cast(std::floor(GridX))); + const int32 Y=std::min(Profile.Cells-1,static_cast(std::floor(GridY))); + const double TX=GridX-X,TY=GridY-Y; + const std::size_t Width=static_cast(Profile.Cells+1); + const auto At=[&](int32 PX,int32 PY){return Values[static_cast(PY)*Width+PX];}; + if(TX>=TY) + return At(X,Y)*(1.0-TX)+At(X+1,Y)*(TX-TY)+At(X+1,Y+1)*TY; + return At(X,Y)*(1.0-TY)+At(X+1,Y+1)*TX+At(X,Y+1)*(TY-TX); + }; + for(int32 Triangle=0;Triangle=OldSurfaceVertices||IB>=OldSurfaceVertices||IC>=OldSurfaceVertices)continue; + const FVector& A=Mesh.Vertices[IA];const FVector& B=Mesh.Vertices[IB];const FVector& C=Mesh.Vertices[IC]; + double NormalZ=0.0; + if(Mesh.Normals.Num()==Mesh.Vertices.Num()) + NormalZ=(Mesh.Normals[IA].Z+Mesh.Normals[IB].Z+Mesh.Normals[IC].Z)/3.0; + else + NormalZ=FVector::CrossProduct(B-A,C-A).GetSafeNormal().Z; + if(NormalZ<0.35)continue; + const double X=((A.X+B.X+C.X)/3.0)/VoxelSizeCm; + const double Y=((A.Y+B.Y+C.Y)/3.0)/VoxelSizeCm; + const double Z=((A.Z+B.Z+C.Z)/3.0)/VoxelSizeCm; + const double LocalX=X-TileOrigin.X,LocalY=Y-TileOrigin.Y; + if(LocalX<0.0||LocalY<0.0||LocalX>TileExtent||LocalY>TileExtent)continue; + for(const auto& Profile:GroundProfiles) + { + if(LocalX>Profile.Cells*Profile.GridStep||LocalY>Profile.Cells*Profile.GridStep)continue; + const double Ground=InterpolateProfile(Profile.Ground,Profile,LocalX,LocalY); + const double Cap=InterpolateProfile(Profile.Cap,Profile,LocalX,LocalY); + if(Cap-Ground<=1.0||GroundTileMaxZ/Scale + ||GroundProfile.MaximumZ)continue; + const double ReplacementBand=std::max(32.0,2.0*Profile.GridStep); + if(Z>=Ground-ReplacementBand) + { + RemoveOldGround[static_cast(Triangle)]=1; + ++Stats.RemovedTriangles; + } + break; + } + } + + const int32 AddedVertexCount=static_cast(AddedVertices.size()); + auto InsertSurfaceVertices=[&](auto& Existing,const auto& Added) + { + using TArrayType=std::remove_reference_t; + TArrayType Combined;Combined.Reserve(Existing.Num()+static_cast(Added.size())); + for(int32 I=0;I=OldSurfaceVertices)Index+=AddedVertexCount; + const int32 OldTriangleCount=Mesh.Triangles.Num()/3; + TArray OldMasks=Mesh.TriangleSkirtFaceMasks;OldMasks.SetNum(OldTriangleCount); + TArray CombinedTriangles;CombinedTriangles.Reserve( + Mesh.Triangles.Num()+static_cast(AddedTriangles.size())); + TArray CombinedMasks;CombinedMasks.Reserve( + OldTriangleCount+static_cast(AddedTriangles.size()/3)); + for(int32 Triangle=0;Triangle(Triangle)])continue; + for(int32 Corner=0;Corner<3;++Corner)CombinedTriangles.Add(Mesh.Triangles[Triangle*3+Corner]); + CombinedMasks.Add(OldMasks[Triangle]); + } + for(const int32 Index:AddedTriangles)CombinedTriangles.Add(OldSurfaceVertices+Index); + for(std::size_t I=0;I=5&&options.farHorizonVersion==0) + {error="far-horizon recipe version must be nonzero";return std::nullopt;} TArray sharpFeatures; if(options.mesherRecipe!=MesherRecipe::marchingCubesV1&&level==0&&impl_->worldAssembly) { @@ -1001,6 +1288,42 @@ namespace VoxelForgeCore const bool bHasWorldAssembly=impl_->worldAssembly!=nullptr; const bool bNeedsFarShell=bHasWorldAssembly&&key.lod>=7 &&(tileShape.HasFarWorld()||impl_->shape->HasFarWorld()); + bool bOverlapsPlayerEdit=false; + if(tileShape.HasEditTransaction()) + { + const FIntVector EditMinimum=tileShape.GetEditBoundsMin(); + const FIntVector EditMaximum=tileShape.GetEditBoundsMax(); + bOverlapsPlayerEdit=EditMinimum.X<=origin.X+extent+step + &&EditMaximum.X>=origin.X-step + &&EditMinimum.Y<=origin.Y+extent+step + &&EditMaximum.Y>=origin.Y-step + &&EditMinimum.Z<=origin.Z+extent+step + &&EditMaximum.Z>=origin.Z-step; + } + bool bHasNativeSurfaceHorizonPlan=false; + bool bHasIslandPlanInTile=false; + if(impl_->worldAssembly) + { + const int64 TileMinimumZ=static_cast(origin.Z); + const int64 TileMaximumZ=static_cast(origin.Z)+extent; + for(const auto& Plan:impl_->worldAssembly->plan.strates) + { + const int64 PlanMinimumZ=static_cast(std::min(Plan.bottomChunkZ,Plan.topChunkZ))*CHUNK_SIZE; + const int64 PlanMaximumZ=(static_cast(std::max(Plan.bottomChunkZ,Plan.topChunkZ))+1)*CHUNK_SIZE; + bHasNativeSurfaceHorizonPlan=bHasNativeSurfaceHorizonPlan + ||(TileMinimumZ<=PlanMaximumZ&&TileMaximumZ>=PlanMinimumZ); + } + for(const auto& Entry:impl_->worldAssembly->floatingIslands) + { + const int64 PlanMinimumZ=static_cast(std::min(Entry.bottomChunkZ,Entry.topChunkZ))*CHUNK_SIZE; + const int64 PlanMaximumZ=(static_cast(std::max(Entry.bottomChunkZ,Entry.topChunkZ))+1)*CHUNK_SIZE; + bHasIslandPlanInTile=bHasIslandPlanInTile + ||(TileMinimumZ<=PlanMaximumZ&&TileMaximumZ>=PlanMinimumZ); + } + } + const bool bUseNativeSurfaceHorizon=key.lod>=5&&!bOverlapsPlayerEdit + &&bHasNativeSurfaceHorizonPlan&&!bHasIslandPlanInTile; + const bool bSkipFarShellRepair=key.lod>=7&&bUseNativeSurfaceHorizon; FStandaloneShapeWorld::ResetThreadClassificationStats(); VoxelForgeCore::Heightfield2D::resetThreadColumnCacheStats(); bool bNativeSurfaceTile=false; @@ -1082,18 +1405,6 @@ namespace VoxelForgeCore static_cast(origin.X+extent+step)*SubvoxelScale, static_cast(origin.Y+extent+step)*SubvoxelScale, static_cast(origin.Z+extent+step)*SubvoxelScale}; - bool bOverlapsPlayerEdit=false; - if(tileShape.HasEditTransaction()) - { - const FIntVector EditMinimum=tileShape.GetEditBoundsMin(); - const FIntVector EditMaximum=tileShape.GetEditBoundsMax(); - bOverlapsPlayerEdit=EditMinimum.X<=origin.X+extent+step - &&EditMaximum.X>=origin.X-step - &&EditMinimum.Y<=origin.Y+extent+step - &&EditMaximum.Y>=origin.Y-step - &&EditMinimum.Z<=origin.Z+extent+step - &&EditMaximum.Z>=origin.Z-step; - } if(!bOverlapsPlayerEdit) { const VoxelForgeCore::Heightfield2D Heightfield( @@ -1190,21 +1501,52 @@ namespace VoxelForgeCore (options.hashDensity||options.captureDensitySamples)?&densityValues:nullptr); const double MeshingMilliseconds=std::chrono::duration( std::chrono::steady_clock::now()-MeshingStart).count(); + out.diagnostics.farHorizonVersion=key.lod>=5?options.farHorizonVersion:0; const auto FarShellStart=std::chrono::steady_clock::now(); const FStandaloneShapeWorld& farShape=tileShape.HasFarWorld()?tileShape:*impl_->shape; - if(farShape.HasFarWorld()) + out.diagnostics.farShellRepairSkipped=bSkipFarShellRepair; + if(farShape.HasFarWorld()&&!bSkipFarShellRepair) { + const auto BeforeStratum=FStandaloneShapeWorld::GetThreadClassificationStats(); + const int32 BeforeStratumTriangles=mesh.Triangles.Num()/3; + const auto StratumStart=std::chrono::steady_clock::now(); AppendFarStratumShells(world,farShape,nativeKey,step,mesh); + const auto AfterStratum=FStandaloneShapeWorld::GetThreadClassificationStats(); + out.diagnostics.farStratumShellMilliseconds=std::chrono::duration( + std::chrono::steady_clock::now()-StratumStart).count(); + out.diagnostics.farStratumFieldCalls= + AfterStratum.NativeFloatFieldCalls-BeforeStratum.NativeFloatFieldCalls; + out.diagnostics.farShellTrianglesAdded=static_cast( + std::max(0,mesh.Triangles.Num()/3-BeforeStratumTriangles)); + + const auto BeforeConnector=AfterStratum; + const int32 BeforeConnectorTriangles=mesh.Triangles.Num()/3; + const auto ConnectorStart=std::chrono::steady_clock::now(); AppendFarConnectorShells(farShape,nativeKey,step,world.CoarseTileCells,mesh); + const auto AfterConnector=FStandaloneShapeWorld::GetThreadClassificationStats(); + out.diagnostics.farConnectorShellMilliseconds=std::chrono::duration( + std::chrono::steady_clock::now()-ConnectorStart).count(); + out.diagnostics.farConnectorFieldCalls= + AfterConnector.NativeFloatFieldCalls-BeforeConnector.NativeFloatFieldCalls; + out.diagnostics.farShellTrianglesAdded+=static_cast( + std::max(0,mesh.Triangles.Num()/3-BeforeConnectorTriangles)); } out.diagnostics.farShellMilliseconds=std::chrono::duration( std::chrono::steady_clock::now()-FarShellStart).count(); - if(impl_->worldAssembly&&key.lod>=8) + if(impl_->worldAssembly&&key.lod>=5&&!bOverlapsPlayerEdit) { - const auto CapStats=RefineLod8NativeCap(world,*impl_->worldAssembly,nativeKey,mesh); + const auto HorizonStart=std::chrono::steady_clock::now(); + const auto GroundStats=RefineFarNativeGround( + world,*impl_->worldAssembly,nativeKey,mesh); + const auto CapStats=RefineFarNativeCap(world,*impl_->worldAssembly,nativeKey,mesh); + out.diagnostics.farHorizonMilliseconds=std::chrono::duration( + std::chrono::steady_clock::now()-HorizonStart).count(); out.diagnostics.capRefined=CapStats.Refined; out.diagnostics.capRefinedCells=CapStats.Cells; out.diagnostics.capRefinedTriangles=CapStats.Triangles; + out.diagnostics.horizonGroundTriangles=GroundStats.Triangles; + out.diagnostics.horizonGroundTrianglesRemoved=GroundStats.RemovedTriangles; + out.diagnostics.horizonCapTriangles=CapStats.Triangles; } out.densitySampleCount=static_cast(std::max(0,sampleCount)); @@ -1270,6 +1612,12 @@ namespace VoxelForgeCore { densityHash^=std::bit_cast(value);densityHash*=1099511628211ull; } out.densityHash=densityHash;out.meshHash=HashViewerMesh(mesh); out.payloadHash=HashPayload(mesh);out.topologyHash=HashTopology(mesh); + if(key.lod>=5) + { + out.meshHash=SaltFarHorizonHash(out.meshHash,options.farHorizonVersion); + out.payloadHash=SaltFarHorizonHash(out.payloadHash,options.farHorizonVersion); + out.topologyHash=SaltFarHorizonHash(out.topologyHash,options.farHorizonVersion); + } out.hasDensityHash=out.hasMeshHash=out.hasPayloadHash=out.hasTopologyHash=true; } return out; diff --git a/Standalone/Research/OwnerShapeWorld/gpu_field_port/LUNA_DIALOGUE.md b/Standalone/Research/OwnerShapeWorld/gpu_field_port/LUNA_DIALOGUE.md index 5ff4369..d3c30c3 100644 --- a/Standalone/Research/OwnerShapeWorld/gpu_field_port/LUNA_DIALOGUE.md +++ b/Standalone/Research/OwnerShapeWorld/gpu_field_port/LUNA_DIALOGUE.md @@ -1194,3 +1194,27 @@ and no link, commit, push or stash was created. [Full S2 report](../../WorldAssemblerM3/Round6/REPORT.md). — Sol + + +## World assembler S3 / M3 Round 7 — 2026-10-18 + +Far SurfaceWorld ground and cap now come from the native heightfield at LOD5+, and certified +LOD7/8 SurfaceWorld tiles skip the derived shell repair. The S2 shell stage used about 81% of +SurfaceWorld LOD7/8 tile p95 and 96% of FloatingIslands LOD8. S3 warmed p95 fell 39–66% across +those owner LOD7/8 rows. A falsifiable LOD7/8 ground audit passes 128 shared points within 0.043 cm +of exact near-field roots, and its 100 cm datum-offset control fails. LOD0–LOD3 density, mesh, +payload and topology hashes match S2 exactly; SurfaceWorld and FloatingIslands W1/W8/W16 pass. + +The owner horizon is not ready for visual sign-off. Cold whole-view presentation improved from +6.622 s to 3.420 s, still above the 1.57 s target. At 60 m/s the clipmap arrived after the player +crossed the route. The approach/retreat captures expose gaps and large faces, and the new distant +cap has isolated-looking pieces. I report those as failures rather than claiming a pop-free sequence. + +No new source file was added. Core, editor audit and standalone viewer compile spots are listed with +the run ledger and capture links in [WorldAssemblerM3/Round7/REPORT.md](../../WorldAssemblerM3/Round7/REPORT.md). +CODEMAP section 3 and ARCHITECTURE section 8.24 are updated. Core-off, M2 fixtures, staged 25 cm +SurfaceWorld/FloatingIslands, edits and W1/W8/W16 pass. No new UECC folder, timeout or 0xC0000142 +occurred. I did not open the owner's editor, build his project or edit assets, and I did not commit, +push or stash. + +— Luna diff --git a/Standalone/Research/WorldAssemblerM3/Round7/REPORT.md b/Standalone/Research/WorldAssemblerM3/Round7/REPORT.md new file mode 100644 index 0000000..e539f02 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Round7/REPORT.md @@ -0,0 +1,171 @@ +# World assembler S3 / M3 Round 7 + +Date: 2026-10-18. Base: S2 / 6ddb834, building on S1 / d6e6942. No commit, push or stash. + +## Result + +The far-ground profile is now sampled directly from the native SurfaceWorld heightfield and the +S2 far-shell cost centre is largely removed. BuildHost checks pass, far LOD7/8 agree with the near +field within 0.043 cm at shared points, and LOD0–LOD3 hashes match S2 exactly. + +This is not a horizon sign-off. Cold full-view presentation is still 3.42 s against the 1.57 s aim. +At 60 m/s the clipmap completes after the player has crossed the route, and the approach captures +show missing horizon/large faces during loading. The new cap is visible at distance, but its isolated +pieces and the persistent distant cliff need visual review. The captures do not prove a clean +approach/retreat with no visible pop. + +## What changed and what the counters said + +The owner-walk LOD8 hypothesis was mostly right about repair geometry and wrong about classification. +In S2's warmed eight-key timings, SurfaceWorld LOD7 spent 26.378/32.739 ms (81%) in far-shell repair +and LOD8 spent 135.960/168.545 ms (81%). FloatingIslands LOD8 spent 69.930/73.038 ms (96%). These +shell timings exclude LOD8 cap refinement. The old M1 Round 4 whole-clipmap measurement had 165 +unknown LOD8 tiles, 13.27 M field calls and 49.8 s summed column time versus 1.85 s meshing. That +M1 window predates S1's relief changes, the shared feature lists and the single voxel-size source; +it is historical context, not a comparable S2 baseline. + +The final SurfaceWorld actor route reports the following LOD7/8 tile p95 diagnostics. The sub-stage +percentiles are separate timers and are not additive; column-cache time overlaps native horizon work. + +| LOD | Full tile p95 | MC mesh | Shell repair | Native horizon | Unknown boxes | Field calls | Column misses | +|---:|---:|---:|---:|---:|---:|---:|---:| +| 7 | 19.801 ms | 4.864 ms | 0.0001 ms | 13.156 ms | 1 | 6,167 | 3,025 | +| 8 | 58.346 ms | 6.013 ms | 0.0001 ms | 47.204 ms | 1 | 11,304 | 9,679 | + +The shared broad-box classifier is not the current bottleneck: the route has one unknown box per +sampled far tile and classification is only a few microseconds. S2 repair connectors dominated. +After removing that work for certified SurfaceWorld tiles, native heightfield sampling/building is +the new LOD8 cost centre. I did not change noise octave evaluation. + +### Owner timing comparison + +Warmed BuildHost p95s use the staged 25 cm plans and eight owner keys per LOD; the S2 values are from +Round 6's same workload. These are tile timings, not rendered-frame percentiles. + +| Family | LOD | S2 p95 | S3 p95 | Change | +|---|---:|---:|---:|---:| +| SurfaceWorld | 7 | 32.739 ms | 19.801 ms | -39.5% | +| SurfaceWorld | 8 | 168.545 ms | 58.346 ms | -65.4% | +| FloatingIslands | 7 | 20.409 ms | 13.112 ms | -35.8% | +| FloatingIslands | 8 | 72.923 ms | 24.638 ms | -66.2% | + +S2 and S3 standalone stream benchmarks used the same owner JSON (SHA-256 +289CD75597C5510FE8751102144FDC949D9B20B8BB23EEECDA37D049A49AD711), camera, 2,553 desired tiles, +12 workers and cold generation. CPU-only full-clipmap wall time was 6.099 -> 2.975 s (51% lower). +It is a different timing scope from the rendered viewer run. + +The matched cold viewer runs used the owner walk camera, 12 workers, 60 fps with VSync and 2,553 +tiles. S2 reached InitialClipmapReady at 6.567 s and first whole-view presentation at 6.622 s. +S3 reached them at 3.081 s and 3.420 s. The first presentation is still 2.18x the 1.57 s aim. + +At the requested sprint speed, a cold approach from y=-1800 m at 60 m/s crossed 250 centers in +41.520 s. Nearest-tile ready p95 was 83.978 ms, maximum crossing wall time 40.050 s, and the full +clipmap completed at 42.339 s; status was FAIL. All 2,553 tiles eventually became resident, so this +is a late-horizon failure rather than a permanent missing-tile count. A second visual approach at +10 m/s from y=-900 m also failed its streaming gate: 50 crossings, 47.471 s elapsed, 134.014 ms +nearest-ready p95, 41.881 s maximum crossing wall time and InitialClipmapReady at 53.752 s. A +separate 60 m/s retreat run completed at 42.660 s and failed its latency gate as well. + +## Shape agreement, determinism and regressions + +The commandlet agreement check uses 128 shared LOD7/8 XY samples on the staged walk route. At each +point it compares far ground vertices to a near-field density root. Tolerance is 2 cm: + +| Measure | Result | +|---|---:| +| Maximum LOD7 to near-field error | 0.0427 cm | +| Maximum LOD8 to near-field error | 0.0427 cm | +| Maximum LOD7 to LOD8 error | 0.0000 cm | +| Negative control, 100 cm datum offset | 100.0427 cm; detected | + +The negative control fails the 2 cm gate as required. This checks the ground profile; the cap is +sampled from the same native heightfield at its shared 128-voxel grid, but this round did not add a +separate cap-to-near-root metric. That limitation and the visual cap artifacts remain open. + +A direct S2/S3 full-clipmap hash comparison used --stream-hash at the same walk camera. All four +hashes below are identical per LOD, establishing the near terrain result: + +| LOD | Density | Mesh | Payload | Topology | +|---:|---|---|---|---| +| 0 | 769f2a706d585a72 | 33eeeb39fa443816 | 645621a1d968983f | c2457ed905036c9d | +| 1 | 69cc5a5c0a2c60af | b48335f5410c57d5 | d15c5480162ab8ba | feca1bd025823604 | +| 2 | 85deed5683a77202 | 53469895987aeea2 | e55f8ae7e1532033 | d5feb12a0e85c09b | +| 3 | 6518caefb3be7e7f | ec513c90b853a614 | f62fa1137ff17f82 | ccf1dcf681965816 | + +The whole-clipmap density hash also matches S2: c10697a8f48380c7. S3's BuildHost SurfaceWorld +W1/W8/W16 hashes match at density 0cd2a1a4152ee4aa, mesh 96df0c8767fd98c6, payload +377dce268955d353 and topology 5165549880b1c16a. FloatingIslands W1/W8/W16 match at density +4dcfb37585d7d986, mesh 112f6f2486ac56c5, payload b2c0a75cf5b9f12a and topology dfffcf4a5e29a111. + +Core-off legacy at 12.5 cm passes. M2 V1/V2 fixture repeats, borders, V2 MC identity and 125 doorway +phases pass. BuildHost's staged SurfaceWorld and FloatingIslands actor checks pass at 25 cm. Surface +edit, carve/fill, scale, reference and anchor checks pass. No 20 cm run was made. + +## Visual evidence + +All included images are 640x400 and under 300 KB. S2 and S3 stills are separate cold runs with the +same owner plan and 60 fps/VSync capture setup. + +| View | S2 | S3 | Readout | +|---|---|---|---| +| Owner walk horizon | [before](captures/before_s2_surface.jpg) | [after](captures/after_s3_surface.jpg) | Broad ground shape is similar. | +| Cap at distance | [before](captures/before_s2_cap.jpg) | [after](captures/after_s3_cap.jpg) | S2 shows open sky; S3 shows the ceiling, with isolated-looking pieces. | +| Far view, y=-1800 m | [before](captures/before_s2_far.jpg) | [after](captures/after_s3_far.jpg) | The same tall cliff is present in both; S3 has a small detached-looking cap band. | + +The 60 m/s approach and retreat captures are a failed streaming sequence, not a no-pop claim: +[approach 0.1 s](captures/approach_00.jpg), [15 s](captures/approach_02.jpg), +[32 s](captures/approach_04.jpg); [retreat 0.1 s](captures/retreat_00.jpg), +[15 s](captures/retreat_02.jpg), [32 s](captures/retreat_04.jpg). Horizon coverage is absent or +obscured during loading. The slower 10 m/s approach also shows large distant faces: +[start](captures/approach_normal_00.jpg), [15 s](captures/approach_normal_02.jpg), +[32 s](captures/approach_normal_04.jpg). Raw back-buffer PNGs and full logs remain under +Saved/BuildHost/Round7S3Evidence. VSync was on and the viewer was capped at 60 fps and closed at run +completion. + +## Run ledger and limits + +- BuildHost Core/UBT and standalone viewer builds pass, with at most 12 workers. One early commandlet + compile failed on C4456 variable shadowing; renaming the local fixed it. The final BuildHost source + build and link-safety audit pass. +- The first agreement audit had fewer than 64 shared points in the chosen p95 keys. A walk-route + LOD7/8 fallback was added; the 128-point audit now passes. +- The first OS screen-grab attempt failed with an invalid desktop handle. I added optional + render-loop back-buffer capture to StandaloneViewer and rebuilt; those captures work. +- One normal-speed capture launch exited before generation because Start-Process split a path at the + workspace's space. Correct quoting allowed the run to complete; its streaming status still failed. + A JPEG helper syntax error wrote no files and was corrected. A CIM memory query was denied, so + launch checks used GlobalMemoryStatusEx instead. No Unreal/viewer process overlapped another. +- The process working-set high-water observed during BuildHost actor runs was 3.1 GiB; flight viewer + runs stayed near 1.1 GiB. Free physical memory was above 4 GiB before launches. No run returned + 0xC0000142, timed out or exceeded the 15 minute step limit. The BuildHost crash directory contains + only the existing 2026-09-17 UECC folder; no new UECC folder appeared. +- BuildHost emitted existing warnings for the optional NewDataAsset, certificate store and PIX + initialization. They did not fail the owner checks. + +## Files and owner note + +New source files: none. + +Modified source/header files: + +- Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +- Standalone/Core/src/VoxelForgeCore.cpp +- Standalone/Core/src/FarShellsInternal.h +- Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp +- Standalone/Source/StandaloneViewer.cpp + +Likely compile spots are the Core public API and implementation, the canonical Core shim/link audit, +the editor commandlet under BuildHost UBT/UHT, and the standalone viewer target. No generated header +was edited. CODEMAP section 3 and ARCHITECTURE section 8.24 describe the change. + +The far recipe version is 1. It salts far mesh, payload and topology identities from LOD5 upward; +density hashes and LOD0–LOD3 identities remain unchanged. Bump it when changing this far mesh recipe. +The only family-specific planar representation is declared by SurfaceWorld's ground/cap heightfield. +FloatingIslands has no planar datum and keeps the shared 3D connector/field path. Player-edited tiles +continue through the authoritative field and repair path at every visible LOD. + +Owner note: keep Core enabled at the existing 25 cm setting; no asset or owner-project change is +needed. The tile cost and near-hash checks pass, but the horizon is not ready for sign-off: cold +presentation misses the target, sprint streaming arrives late, and the captures do not prove a +pop-free transition. Do not treat these results as a completed visual acceptance. + diff --git a/Standalone/Research/WorldAssemblerM3/Round7/captures/after_s3_cap.jpg b/Standalone/Research/WorldAssemblerM3/Round7/captures/after_s3_cap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d85a31486e722524881b7dffb5e919849d6a9b2 GIT binary patch literal 10785 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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Round7/captures/after_s3_far.jpg b/Standalone/Research/WorldAssemblerM3/Round7/captures/after_s3_far.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f03c0210e79fb06d5b662e4ded3d3c662c8e31be GIT binary patch literal 17073 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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Round7/captures/after_s3_surface.jpg b/Standalone/Research/WorldAssemblerM3/Round7/captures/after_s3_surface.jpg new file mode 100644 index 0000000000000000000000000000000000000000..925e7386c47a2886d956f9865c2c1f13ccedf1b9 GIT binary patch literal 16721 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 TS>8LGs2yKhcRYgzY`^(0Ip8ui literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_01.jpg b/Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f39332fbbea26847263344e0a5b55cfd0acf1f64 GIT binary patch literal 14462 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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_02.jpg b/Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c59b23662193a252c0596008f9f0dcb976614218 GIT binary patch literal 13677 zcmb_?dpy(c|M#3F(rR-)WJ)%XF;WrHm^0fPT2khaDMdOe$1+-kjAkOSgE@pu=o~qu z6LU!D;7~&OlpJ!tuj%vq-G{&K`+j`q@jiGTuIqJvzFx2Ez0$Mt8M5BN*4`E(A|e7g z4E`W1eGnUngqXOvxR?akNk~XYO36w~fuH=^wQFRd@*6fl<)P4x3TlcQVJdJaR7p!o zMO|G}Q*)ytVlzTxvzmschHwxO@T!!g)H-SDbs8`zOymFgxAGJMl@>`8jTI9?Kt!P; zVo;Hl=MYT@L_`8mDCY@k81lGhh>KHHur+6_@8=0@nr0*%o$wMnWL*WNFflZ#`vySldw+ahzNo8&be?v+l#4jjdo zXmY=}Sq{t*f4H^i+92OpBz_@sG+kTyL24dIPu_;sr%RTobC#~HOj|i!j@H~z%@^yu z3(-V+iPa0$iJ8R`)5X)HbDlSTcByuK?ywFr4g)s@A@)?2f--5DNR0~wq*oc_K=QA? zNnR%ysvJ7Vaj@B!_;Zm*HjDn0sa|yGA<8z`Hrn@7<_3-3(ZnA4mo6D>T+?kZ6TYv; z_g1Dg|Bow1_MnSq^|yC!hmTMKhiZpoP@hH0?P8Y(dTZru<*N?8m6}zHoBA>DW~ps zG!gb&Ag7>C`^=^b;RXUq;w39tL=HaPNzX5-dUhT) z-Uit)Kb*Ksetq@6%m6hHdoSjrO~rT1@S6(}zi}vv!tF+Pgn;G{mhazPe6U=yOyA~| z8Apfgvz=7#bzHHGU~zOG?hH$vf>r+pC2#apD6#QWNNYD7wTs-yM#8oA`|?nBqi%h~ ze*|eQiKL5B6mA&`FM7^Zr%oQG^E!x-e8S^Ix#m*HxWD;3lOb5+l#%~GcFFUfS0K~l z7kBetjbGGJhq)hY)^*3iApfCFWX8Pk>!Q?T5yPMBP;E51=h7Te+$*cSGh2k@N4i;t zDZ|q0e9CsPU0%8y@`71Sg7tDpDRXygKeACRi-+T+V`Hx*7>^UunJHORYW7Bh5FPjq z7dex6$pU3hY*F-Ra|nNkR*vYzkb+#3Ld{>E*r~W>*Zg2z7QFu&!~9ZrU1-SL?=^P8 zOMR1123)o&r*A5r)b}}Ew3*bt!96qN!Mc#|B_07JzN0o9My9)oB^Z4UL=Gk@+gK^R zTiadKV%Wt!`H=bMW&{bLti)!)#>krR{SKwMA+4uaO;-xJofP~G&tK=>xaR>jv1Xy` z*ix@ka7vLcy`- z?eMkwBtQ4NoqT-Y$=Z2>H}T84qU;coz7g7v6izx}V=uNoS%sp^+tq<`L1`QL?yGu;0PTx2C?yo*xbkUpTgA80wm~E{oIVuQfg&Rx_B0 zx)$=?zs&ATUSRUC&+07=QllP{!fIV{~BY#<*ytoia>dj2~oT9c`TAsK{C#gShW-CnlItkJ{=R;VI2A;{{VPTRQ_h;;U7+3$?ap zXw=cg&&eFGF$l#qV8(2mu;(|LU#o^6@MFe%OrU`F9+d4xbQQj~9mls~4*>(b-f%Lf zrTLX*x4irKfj193kCz~nKG=vF?wvpps`Mh_(nI)HNxfx-q=OH=cSqi~=&l+jy*HAb z^I`^erJd15#Oi%8aO+m@d1lhqT1W6cJ02f0=#>1+l@!b^+b`DWsE)?s zE-`Jkz{v)gqFqTL-p#sm#ltaS9$`;R_9tDe*0z~hq_^BC+mCG}Y_h2p)a`>_a~3(7 zEbox1ID6TxWb%=r`OJj2TxZ3t&nGQOwCallk*kE?=*iZ&C(vi5#Zvl7h7j8eTtr07G4gN;Wm?e6w) zca?kN9>YGTN_+K<9$s}bEQtz15^8zD{8z8ZuY5`C3umviYR0%W)s89_-TCt~!slI5 z>AoEr7mqH~?OHG~dmP*T)`)0uvpeqE?W}E{SJDW5IINQ=(~Ei7X4BwZ6SMj5-*$CJ zjonj+%{{PJZhlki=+1lbTSZi*^HrowrUEl53U#jSD~qgK;upxo$P?LucX7Y}za zx^u;M-%=`h64;wR^vEVqtHQ1>{95O@BSpE^=Qrt0I-=;K*)%W9@#v}N=l%b24`;kM zqIKO?Y@)KIs4#YM1(I?ss&ryoad9(GtZd(A8GE9eYqf>-i2RV_p+7flPD;(!nPzhB%2ZvEys`pO39CvJBgaNDI=r*5 z_B@}=p3)Ce{}_~gN_1Mw$P(@0`{tLjN0|XUXX4UE(de6Am1{4q+y7*jTvhtytJbKo zZvE+f3ljamzE(c=*w*cZg1pet8JglWQcfFOEZP4_{Y+D{COdMxIZ8FqyXEm~=80Qo zpQ)M&mSuaMeZTm2+f`f_TcWVzc#qhng#wf|cT9N&lDf8hVe->}FP{|T!|`5$Ja95T zxLtyjDtyH&qSdnMAE1?{@#V#uKOT%z>LDlUI6nT$FAY9gs!YADcKtxg__6LnG~Jx| zK&tZKTZ`2C`{Q^1sVu%=UM&Bc*YWKB%S}NGsEs`@TNV?}?uj@uK@02ePwM;0n}5~( zogDV-&kp?ND+Zz3&92!wmTX`I4?fK;^A~d#_3nEgO#F~W(2zVds6B>^3W{p}UJ$PR z?ChP*N-7#dPfSHaLw-!_q&r;AhK6)MJ5c@YMxFUvFqO2Z$Wo)U0#26 z`Ca#|jF<#qv(iD8OXIE!^D*`J>qrxOp1dho@c2CH>{Yb=$VTQ0|Qd8Aiq z67dw-QYO-ls+68+kz!f)xPC^jZsPjV0D!e@y!~wALg5@iE;u3uQ;)K7Mz9Mq5SYt^ z7EU_e?G<7FIi8#rtaNvpi56U&cDM*N92l~Ll$(Ig5~da7?z_6;`OUs46@8;R7Po@K zjHl*d0h9?0TZ;P+z&@P0*&(+-J;I|W)Fj6f|Y&51Wk(^tWgX|v?y>p_*y*iU2mU zIWH*HZC>)WOu?*4wFj9JT6e z=!2=A`av^LFn;wsMw*jT?OSY#YC9U-GGduvI}=_bc5=xxx6K>WnQz3&84Ff1;W4P} zsk8%o4mV2K`-C<8=H^!`)x$0y$kIB3HQr$&0^Pp*c5-!=GMg?bMAJx7r{bGn&sv zeO|mHKjbX4On>0Y-lV1yIJO2x^VJfE+z}=}U?p{vla_FNDlle*DY*FL!(s|V zRW0hBS$_E$ndkyKe3mQe`p=FpR*4Qm_8t5;aJ@h83 zp$w@uT*rv+9$P z+l6$m9m{P8xUhtt)Q3mm`{_|%7e}4$`hPKBXm3?Cnf&x|v9~bDzy0licfDioC*$a9 zOa$&>)z@oobp^iev-_*YD6&;65Ln@4@ypW><&8JVXpZf^W2 zI?hUKM)Drr zpRXBl$5@@ke2;xH)2RIgAI)JNe;c5ArTAQk)#Vt)ahLkK)5jlqP@>!OUJ~oWyEAT& zJ3Kx3`;n;NN{)p>(ZJhZ?!apvc6zT}rdTAXzIN+v_|x~BqpY^m=blAyg^I7gylZRT z-N@z4>_-b3I6;Nl5sbINQAPC^i=+E){qQubOVhCDZ5Vj#pUPId9pU|A!V>uYBqGX*UWLvph0RpieiC*wHPX?1B`(R9b;#S(e#4`7e8S z{ez5ok^eODv89TEg6H!@I{jo3aD^Q@##&ruJvw(XSxT8M=FGT%S$I8q-&gY z2F2Q}-6V(1&L~=eoQgpuzso;Agky09P`r^TtOJjSzlQ9?YH^tqVR4{J!11Ix>9~L+ zY+GA7r}{!ad^;|gMiE}b8|lC|mI1GM2^=s}iGXS-vu=Rr*j`ETb3(8+=-ninO@W{z zaj(AMG%pZQC`(ItCs}&`xBLCCw+lLUzEz-i`}p7HIKrvkBp9XR$lTc zzcLkrvN<2BIl)-|WwpS4H|phbP{O41OXu~FbHDq^?8%vH^%+OHtBoZNHk%WkAN_$V ziTh3Dz5OL(B?sNgp{T%{9d7C_|6=zdMLhgWbej9(2tTG+9vS95j)=JA9n@WYtj0i3 zXWyS^PgzghUiWv*n(moFmZU~z5+jK{0Y~*l?$`-RZRf`F1*r0TZgH8y+G`pI&cIT{ zLw`8S?B#i8CZ2roUUGruvHyF3Zx{Dwo}4-QTLX<07vKF|%8xjK=;exky>CBY(_7?2 z;*Am+%$>jWL^?aJpJ^^1AnCO4T_|Aw^e^c8AYD{dvAl7Pcr|R~59Oo16nlHtM>=F} zO5s=RB4tne+C1Am@#*>7cEaMjs<3GrO0$-_Qg$z?Kf>oMRK0D>)f|Yg+||4eDYaQK(qh4f#+BMs2uM;bm&cil}A;^ zwfek+MHN0_K`^Ql;p|47)j!zy!R)te%$v?`_i^X7Z(-jRHI8IdvNk#{4LK;#@V zp5ie2{#fNp7QPq@!JeHiN;*BJ`&)Vx8(X3NCap)OXsdx_0qfV1__@aQPtV!A?_2lJjqOhjr1&j%MZvo^-8{eqzh4BFt z*hsUu>CT9>rizxL79Ng;5m^K4CzkT-QMR^NbbnN&fmSwpd#L4uPPb8CY_xTJ{S5CDvY{ z&^+0LLrUnV1tqZBnHo-1*3d=&S%c_9Gp_6-N{hC7# zGPqYLt+#pJk`i1A?hp27H?cE^`UEK>7}Ml~hiL1$8_}Y}oeLW3 zd;`|L>5Yx^y4HK8{#vY?gsZ-5h<{qZYuzX+meYxu*Iqu%oxV*zNEJIBP!JGwF)k|7MiwWV|@EdL=6gxi5(SN|YHo+Q03{+&Nfmq)gkS zv*flj1%pWWS?Aq|QU);6Mi78)>@xB$6R9X?)~S4HU&$iUC!ISNKhh&ctzdFBcPOJW z<=94_q5Fa#haAp|=4>%!`|3WXcPQn{c>6gd)W~)fs$=Ya%a=i-L^jO{Z7R?a99Q%F zNU1zywKnXoc$6&_>Wp9^m{>hoKbQbzjb!1K8k_@pau|W~S{Vx5SSBR_1Wj~;6V|Yk zo-GHAYnsE%f!TJ}8-t#^A1*j9tI*F=iFizy{%bvB1#&YvsSebubsJ?;vPz9QkD*9N zqbmJ<I;i-<>u3bwV zOQ^!$iiKDC%cn~NBetq4HzGO4UfGKIUzwi8!#ym2OjDvxIc$c7Uhwd-jd?#A!AwUS zM%Q)~svb#zJx~?oHj>LTCMd1RkDisN%CpVvn$_CFd&;XHv{#Hg^6sZY&$Kz~U<}I)*%m42E6r@Jx44r2k>P@CDR#Dl3wb7J?>%mpl5?CCNTcyaX33RQe#T+ zEb?n^LfGzzmylo?`Cngi>Rg`;*f9#ON;F@dWv{vRr>FtBjB=;#^gbxx8!@{AA)V9U zn#jL&eDLvx?%Wl#LNP)1eY)W+>|{c-dSUMkNJqrC`s4+g&+Tvr0gNqcfmJSOsBOB& z@HaWE;)@hTmkY%qWht=Bgx6XuG?j@p7eH|V z0eE4Ni1T+wXR%m_v=)bXf;2CQb623eKLJBy(ERlskwyrR%+fF8{k0HU0$^74T?r!b&X@*7bLn3JYGSsV1r7zu$x;UhiEC8r_KRC_`)01`fuscERITadoj>$Z+10|BDz`Oo= za(u39gE?5ZK(s`R<5RegRFad*bUN_qIH@6Q{qu|Mw6wT?aCR`CZN?gW5eHRf*a&cC zDx8BkeA6SA|KlOP_PYmqsM@gE%T$wOqpCuoHHs;z$8wU-JS!)+bx7{mVB$(DK^%XnYE~#Nd#0%UljW&f zY$rD3WQs#Woksh(b0FNX@8%Jyk2eu-t>v`n$vZ7ZIsG0(P<5Uup|%vSF#gY+U~acv zt4qjx5`}aYPCI;SQ1a%^?;&SWEqLPRxcTevjyy)zhA-}fAMq=E$quV@8)>7tdp^8x zUg8;i@DcfPGAa*kQV{;PBbO%nJRFQAvmaAd_>tV@qTNz%Z3YG zQ5i9JV^l<6^vl1wMpS!M{Z(d%*0=}lkzv*Lk4o&8#5X?md4p+1Q^oOwan}R!y9LAk zBm4f4uxn}~u2D*iYDkfXE1pRK%zGP3KWX_vvz38$)cqTP^aSSZbkJU4HEN}>xNcaj zWYBCF<)k$UgAt|!=P%9aXaVNb1O>(-G%N22_jE$VYg?>6?lO%6N5bln=yY(CjbPTZ zSl0E0fzNm?97C3oB~bi35$LwY{IXV@s~-v;RQyubt0$lF}T;^07|ZL-*FiSI;^8!!tZnLFeRLD&vknN2$0S zb~qB>c^0d4S)(&v>ldD%SB{3SVShtBty=@WiLt8Qqo3PYAB1_36GRq#^elBApc#&1COi2j2<4g-O?qR|MJ=G(-%J?O-iQOd(Pm9(=5C2vD){m)c?n$HBsNyKWEHOEdmD_-50&;SIJWBOQ{v=XPD;)p~z5^sWR#-z?c7h@8 zdJ+yK=M@|%z7>IBV4dn2SgnE$Ai8iESX@g|;R(1dNg5>N5A5>jDeB&R&U*NEFAzO4 zOC%_45NnL&_zd1mheKyiNm?ey2(+#0`O>B19v_TChA+uD2fVDsot=z|@VpZ6s(4q0 zW(t~VvWyDqvM`=*w6()buU{HSwV_GFkZwq$i2AQrV?hE^)LOaIJPP^k3CTq1L2&Cx z8Lo1qdixEU*I`5Q4cHPLNL;Q_iH-bW|Al6y#6sMJ+l3s=pTUSI!!8qZoV7@jw%8rO zpc(A&o+O$zKwz}fz5smad}mH@pUYq+v|m@sM2loaKPW*Zr&R0oI`c&|dQCeYVAb%- z3KqO@ynm12N51sE_Im)!dJPcjfJK@h6vTW5BpUyNgiOV25=M4X@;T;an$iB=Yiw}WTR2ozqnx(<*8+UA#MrZ^^d2B>Bloo&k7Rm!8I z#*DHpFiDncyQjC`X?KA5OW zG4;61Z}JT$HuSC+$2{K8L(@pnExzsP=T9k(g-El%H^15Yg?6xdi;i$Kztz%}+p5-p zlrt;aqL#FiDuB9j(%lB}Y5ndFdkZoX!)sZMdy?_W8c1m#8i!R7$-$ZwO0xRwFJa@q z97!F=U9C>+F0Gh`wZ&Gk;=msDP)J4L6inoC$ z3Ts#~fojkw=@lulwTodHH*HDWs7UmLOl^V>IygfmzkbIski ztZy-*DDM;A`u^L`2(;hozWi;O*x`F+L=HnAv-#_hJP|%MSLmITQCCba#E-*_2C*|4 zBS3z=p4OxyBmgPv$Kt9`cq%F&i>IcQA(CE$deJkjOshZ?*)z!MmC%BlsbIUoODmPds;{o0H0v#6xbyF11I;g7Wf#2 z9+VL(hUjyoMI#Ll37-7Z+g>A@BrD43OZhTq z#zgADjDJ=;OdZ2xtDttY&HN{eT>zYhkg`Qgg@Wv)vLrjaK_(NI3|z-S(ompsp2M`l z0H^vlXQo*L@wU^>?98X7_lII==V1&Mn!!TkVYeXe7{eIcL4b)$SS{G1JI%_DhIR!u z<=6jL0qn!IuY~@j#1R()C4fSweOp3I;X7eXaQh8jfkirmXP|;tEr;W>yd*Cl$7jO%LRkmGXWugu@=Z_$DQo5zW>Fnl*O=Xx%VB1-{M z2Ai!=^079~FfMxw1S24fvhXVFfgX5r_WPnnacm5q`mboMjMDxUc_C~PSIxRKfLFRiLLog+g1D22>+>2wW0~Zb=-dQStmsLH&HbG>-M`wLJ~(B>l@4<%EY?!TZ-!BwVo8 z4M+XUFgh@PJWWNtu?dSQGoU=}e1E$i6ecKwGa@csg#t&zKyCv1ksvn^AmgCJ3Q>M5UI+(&=0+ATxpx)v5bo+a8X+Q}(!N*oEgNQ~{SzIQpOYTWKjJ$j+{F!x1a_p`Xbw zd0zt)d;}1H7gdqlNk#ITwrGvIuvlUgB#8X5wJ&&R=j79vu`Dza?E(xSP)F$FApQ&g z1LjYt#BNf>?z$e=e_U5Im*(T9s4R>wTSQerPzO<{7^)1yh|t!OF4O#{Owe%EJ6Jbb zAf=#`&dJos^x8zF(Tk=y>!qAJL~8R1PuYD|vIRFinOJ)-HGtre_)B=PbbJ@p3af)U z<1$!?xEd!+aY1a0O9v>D$9MPhp@1p$(bQmN4LQt+g`6wRTDNw6Y;#egIKUeyPCAJt ztmv>1TR;;X+*F2w5x^b$eT20ekJh>TiL- zs97{fsN^LeBpjtFt<7C^nxjH5GEqIv(&8tU=}R)6V{Thep2_WEr^pq;fT8$@WA#B6 zoJ^>+2XDf@yVIn?8HK{5)eaba5l_yf?tt<6?uS+Pa@}cUfM&?4%LE{00Sb>~5v)N0 zQ_lt)BdHRHwWl2oL&j~K29*u@rXuXQr#fY7CiQ-Yt({x2LOq<5?z)qOkxjZr!J5$= zAZ`>FB|I5)MlzJ}X=V0Ut+cxxGF{YB_jG6U`b>-j=nXf@O0G8cGC-CMAbr@K21)&^ zjaURC4Im#7?!Tnq|NBH#xatTJ6)PxI2#(gez-bA;Y;{EdUt?&TBst;G%_z!L(Vp<> ze0jSYe^*&RRzf} zoJ&JnQB{B}85}L}ZI^Jh2GmQS>4f7La$=Kd$?;8WzdYSWG&G@69CR3f^`#5t3u31^ z9tu3qxe;PDUNdS>FdBw>%&Q#5`(8@W$EcjcU@#3J_{)GrRb>|NR%_h~XuAFC(yNGY zA~cAm+KozF5I`Uxmf^{(cB%!}f?al7U9M&Q*Sf9nL_7dI0_;<`;I#S(xIkthR^J6N z&dCj3%XWRdhhNLy`#ZI4lf{O=aK``%`Kp<=j_tf$0IX3)7;n)W8p*~=LW^AxtBOUk zSfY4B5zDO??MTxVsV&H&+0@d7aSg&?aour}?JfmzDL`RJkP|su!d~H(;%_36^|2da z{DNdRQF4aRM#W7tV2gMavJ!;_`gt7jAO_X}gxXaz{VJqVC|VW*2e5quco^75;=?Cizh0SvVER1%Trl*@nbm8bR&t`Wn6~Ik^l& z%etP{G6PoORMsJ7uYxQ@nll(H%McuvSU_J4C+pXz5Pg!81GPfaj^)us z9%pqQC#S>%B!d6V?}2@hs4?&kAhuhrfA_K4ECg$^Z-F~0B$qpxFZ~OANQABdli06L zwHj7#ycEut)+Ce>#2Tx_a|#vGd0x186ZbA+`JOA$S)DIsqfmlvMzvhRE2EfjAfIeY zz%1EDmuG%sf;(B*>bIyrM>Ir_A(V%pND&ng3j#`?i|?Cn)|xeI*8C?~_vYr@Q}*6xpWiO$Y>jM9fOZma z_Baq23y zD#0KS1q}ry6%{o#wcUH*`{1hk_NuC>Zg&C(nu_fZlNA@2RfR&Js{iq4s~rRp2WJVz z34`GvAqZF)0^WKGQUig&q5!qq1pn6uEF>%fP$@1UDFsw$+6fW@3kwSY^aBh4wWERe zAQ6b@E)BHxj@_<)V(>8N;rQ$daZQ`X$1qa=w|)Bl7ZM~S<@YEkD(%-gfIy-!28Kq) zCP$9iVsUnOdji?b-NV!Cn0LVGz@Rh16l(azOA(hNuS8wHk(iX6a+8*mOV7(MC@f-B zRxw#@PBpjY?mb>pb4zR6{U;qy`JG+e&w2y{gG0mrjJz71oSJ?&^Zvuf*-zgWek?96 z|NOPGy3H3DB>XR1|IOL|#uo(OO9+@25wUH)z(SXSOBf;|s)63I%i2}UFKjpbaJ)Fw zCcC2Xv4o~R=^M=dLcgT^KFs9)@7t{X=IsBCv4sCG&iAJgw;D83#N?TCOj~t!OpIjR&!kdA7XH)n8oajxfi5 z|EYdCu)z9Cvq31FnO$*VerTDocNoul2A*!2!8;EuR7AO8@tvyCmMAdLp)OKJcxRd4 zifb8X2D=~MVd>nHTXw$Zx**p;Q}|bmTjwk=(kg}Ns<>{63W!n5BaBq{f^6R=&kzrk zzRfe|CNY`tvXYDIHI5sWs5J7YWB8*3EipMVzmsu zJJa`V9s(F9i3tT6jhkDdTw==dG}Z=r(lIf>E8VDz>)b~jgd;8@b&)ETC_l4|vOMHk zC1VhL#0V9+UQ@pX+HO_kEL8bOQL#c;Ki}rg*g`E)k_t9zwcnFI^2uE0On2zezTHrR z(@J69P3b)Z=(R_Y;6V?WB_=l-lT7i`@c!>A+6|9Q#+aW zD<$fqR{Kt${>Sukh4Y=6rRgu11Djv#TB*>(orrPR93LbdeLfkC@VQ z=Vjj_=t_S6yOO3Iu3kw)fd12q#jK1ouehIC&V+LAOd!$6a-j521P}p9K}sLBVqp^E zc0dQ5F?4A^CP&F>G48@ZI);3c*`pLSfS)R}$Dh7PPGOp(aE8TB7(FJsJlvk%iA|8t;tZBlO2xXCLR(L2Hr{OQ<( zsCOU3kf7KTrbv|FtJlftN?7S$Ls59=<@ z%;70dSoB0p7iXE>LP#R1N2Lwkab-B3b~3JZ_HLM_#jgq!WO?jtN@sjJP>0+_0J-7^ zE3>P?dsxOl6rub%C*P#F!{_W?P;-~+r5b-QD)tAb1V}I|Y5tOk$~Z|*t)`;vMve}k-+LA(N<4#3ZNt~+TN)$tFzA|zn~suXAPY~BEY;!0Zq&s zD}hDM*^~4z15Qkgv|nWjh0P51tEBhi{U!g9j5esj*$yeYy+9ck)NVkM0$9bm6o39kz0S<&wXaE0Fi!V;3dKT5`aFS)L%8$f-1`>mMF*Da2c^&1arOKSU^%x5`~fwNZuzIbp;B$l)}#HRI+x$&soP1QQ0Cil8ilA$zpLV=nN?iMw0uZ#HYEl{Le zt)Ot4k!>*#(*MOhy~a~}%H1+x_N>gBN9INtI!n-s{mu6F8_y1$UOM}hMU4;&L`Vl32$P->s*w$B!a~U z?T7OG<95+}Nd8$*a)IZp&VJhVO6J`lb7eGAkTOSdvYu7~>Z&k6#QeZh(Af+^7?as~ z1M{#NkYSQu^@v+%RTzn+0naJLY9Y}TRrSbO9P+B$;cNg6VVVLksYl5U=Ih5l4lln& zfs$N%y$wU+^cf+Moz!p3`RR@&X>Df147dC`!L z;}7KA6>mQd@G3Zqs zto<$XE<@h5fA~XBY@8V&tN-4gHAR&n-Q>%GyA{q2X^y>xgs*>^X-T;Ft6QIVDKvTq zG^T9&1Od1AT8?&%*}%T$++P>uhAaN5UQH)w2EeYVRh6xT7e)u3|IV_I>la&Z>)isy zdf#?lZgoBeTB^A_{)W3IfH;&!cRg2qx;xSmd%^JWB~{A@8Xtc2+HHZv&t-0boFDys zy9M%QUw!^}dBZA$`u2_R4|L53?rWdM&p0#1sx8pK>=r0~3$(=j9%+ZoOinms^0%+Y zX5NvL-FAly2TV=IFDh4wh`I>YlxvA2kqs%HOjSs{BJhkY{agl1MK zVEDP0qp}?$0?56(GshzIw?LC}{ZY~Rj$5FAg0?_P^_M2nEgV;5!p>dw>yZ0r{g3mP z+ShKsy>)0*S1gKJ?=pz| z+Q8ylOz&62e8)LqR}m4$MP?G$)P7zb{`@diQ+OrZwIzNDB)590!aPag%;N3OFI#f{ zjJocyd_(i==EcoM7vG)(rE)v|5c~Cc3-lFWU6LC%865@AA9$A)_TsGCiqg`~mDvV? zqH-VEi<>&~bV1_tq4GB$j`?))Ch~8_?Wi^CiD(h)`}W5x#^gW0yfzJlee7BbT1Z!O z${GFsW&S7B^t%?!u{u$M=>cffOC`jN;!1L+p!PLI3D*B+Ki%Y|OL1%-iLYDj%l~QC zOj`m^-V)gu!#fYQ{2KJMknR6sIaD=PT68mW!GzuDvZpb-zvX0mEDF613HHbLPX0y} zU1TtrM{cyI?br|f>`D@*pq-g~VP!mJFe$4O;^06-;{(DRXx@aQN)#Eh0is44hCXd? zpJs#LklY&6`DnfaEr6EO51zB9UD+$}&s9>Up`G|U0L1kPxAML!OX+EnX6m1Z$vpY) z=^pO#`oMD%Nq^`{tqU8A-ov;j9a2g!>@m{*A?cN0|N7`=78quH4^=T3cy*1`s(AOn zR}``AfhB?AMSCIY)bJ&31JSCOz2Eta+E?+Pwerhp)8?o*4=X(PrMZU6o05F=_WCn( zhG8LV31x)(tKs_&P)`qOhU;G<+c)vC}{#yJFa%?(3j{(N4P4y$jQ@|iG=3azNc@~)wSe8 zO3wLg1pf$${gWpZ`JH#|QJxK^T7R<*h*7Mxe&{%d;eB6@EwEz)J4S;zu|Y?-K<4*; z^_O?5HRj$Lu_PEBU%n=2W;}W_w*`uJBeI{Z@7uh%xYI2Aj=EC%9l15HRlzNbNz1>w zMk{mvo{0Wfw!kUh#lNac#2vkb~oonk_Is*>QT>TS#b-nr)46-IjH zz}i^+V%>87q~|xwg7j9yaDwv6~O^l~3AQ^COt+ zxk0Ss2AhiD)qgPK7h?~<=zy6iB|e!rAF=eTDlg-MmCmc^O*(XJ$a&^i*r)J|r)8E5 z{B`iLyZ$oIpq_m)^WxB@@`Ju*EcCgFtk90{(0_8AC%s0Z5`q=ckS)+fB??V`bGK{q z^!v0Aueib!AKrIWK*8z>dKc=RJ45cQFInapoIcv=7ISfW^SQ=41vGzst$h=kgm^jb zO6-t*{!7VHc%@HhgYnifG$trMWJi?T-&rA>-=U8V{j3H*QFs7e8R*{~y1F_j>bW*p zT^0IHHCQNO?w8yQkz=&2_tw5mnHW)>-=?&+T%_`S2dAn)U6U{x|TKZRI& zUFR&8rx(j#hyAo#r}|c0kh*2UaKESta{ES)3(2;xKAl$>a0#2)nJUU>C|_Xg+*9PxBX6*?LpyGKBn0W(%Z~ zJWX7~JZgWpA>)JQgi=JPCeqkFiq?}wJC6C*7T>Hme_t`y^|(f~+7k1UwBF<6pAfBS zPX{$Ww%-wy9(c2P+xhRhCi=mck7`F5^-yrHDRkbWIxY{#S z_HA5L=$VbYE=e}-cucW8(v-KKhov;qM&Q#fVK7!qRLcn<^B-^Y{ zM4b_;ReI`d=v$V0V%K+JtLq1#0+dy<3ev{qu#!zz19!dAE*~M3TKna-MESm_@AP1i z*iT65GYyp!ws#$?R0B=tMWkEFzet6}eFNUFUTUSPLtoU7sS$92%ry&B#vh&S*B;f& zTZh$I&$|}h>rde(l#r9cGUO&5CI7Pj(wXFBJm*1MQxdX!8#`kKwJRDgky;y?+-t|i z8r$-Gum%*ddVEfI)2XNCToDIgWc-)0UyrlEw8P;+o5&vJ#=%^Qqtn(#|eSZPU}qwA#7u`;B#lzSc`wK z(4jY5pbNR^%t>lNcNR(E_!>J-VP8sYq>J~CIojo%@x|fmmt7r&pQZmb%Qxx{?GQFw z=G2+u#Go^2U-nKjK)6p9*H>JQkVnF|5tAR)#en+LU9BW&-af9|KpBPw=|C%KN2Oh9 zK*7;nfM(%Fk17On{0l-f()gy(Z@dQ-=^OQ!dM|CFHa;-O7vat=3U+4-+YAg*KJk{k z^GTXxj)7BkAx!OKce|@H>T&djr!OLXh7waUTGhOhdTf19Leu4OqQ`cqn}o*DJA+5c z#zTDDFB!<>)9#$3m6`qJwbTvU-PzjRdeAi7qX;gHs)>H7#eE(4(Bp=dt=E^%3+A(l z6#Mfw!RJccy*!mX7*O*5Gb&KVjqaY9Z>z4S+QJ|Y!K{r5<56VukFb9hx!3qF%_+w+ zK3+T6Q4P~L??+7E0^J|nl=EYFNM&bP-bajmMs5K)hcIlyJI5ZmH@zqx@so@hN-#e? zoGSWMJh_!QVm+CzD;9>cs(c*AB5L416D=c`)NTovPGxmoxiZHPITgW;Sfg2@421O6 znlK$@lLkl^=h$|^-aC%{)sW~yz&7^3gRC1I?s@B-WuGlbKWcL)hr-@v8gx51dzQ#o zig%Wkg9y?$rfVaaCgtLwEzl_%SqW$sDycKpauS+f<<kb_^GEF;ZXhotK5H%`7_PaQj%Rg`^DZ>L zE)G0U;IeY(Rj)}JNQ2O&dCMYYh$C z?c@09Dbd1XFMsmE8n4RYhDYoeQUhISrvX#V$?AfMNs37u$C_YMW} za$`Chtry~@WIc-dd(1ce%6ah8O}w&>ZOo~uL0axWMp zy2p5*)HVpx;|NLv+UI-KwZ*&llD~zK>dvSHBZ46ky&5}M@WMf`;=~d=NoqW=lWKUf z-c)vCA>Nf&-1-_l>x6prMlD@KSfzSKD#dX1!*?z@zP;vP-JSGT+{z#|zBAoZx0dw2 z+}=ElR3$tzxR5dZ!@*|$B`Wp^{oq;SZkFHc)L`@KSF?=Vb4Y|#irB+L1R}>oCX?!P zwf|J>rwIL#LE}}LVM|aI-Q;G(7N~?Y&)3txjCoKz=Rm*KZp9pP5-EM^icOd{>~Dc- zjZ%CmUIB&~i!jy2DIUl!DnjTmFOhoos*BrIfsjy>GA=f$E{{3ph$Y>bwdbu3J)|ch zT453W&2@Bk;YM{U48X&Cj;EJvcj(U%HO1bGkcAp=kZrZseKuj?AsPf-dF?Cq8~kwR_g#4)C;Dg{XETBUnTtmTp zx%e`m4~Bw7Cc1+182C<7q)!2=m8D~>qn(x-g3hmlF<;>WL+BHEf&N-dFQlOSy}kLbp*F6XYJY#k_U~Urx8+d2PtfP1QVz z_hpFesH59hu-8K5`#89iV?OMB;b}E0Pm={%Bey~;$YpdjZf$mpf+psxZpm(jh}t1G zvX0X*Rq8@>X@w?v2C@$iHH~&;yWT&w)Qg4@+|HJ`-=!xVxeT#oVY)oMkEG{wC5nEc z%MMQ0yN@*l7Jq|r;eq(2y5Y?CowDJcyS(1TKB?m$aH8IS(jMjVAim}NE zWNf6ya?)ocL)cE?v~$y+V#i0!s9T*wLZ80 zOsWs5;foRU2I#;%a)?QI zYc$o7RFmFOx(L=kWEr>VR!j}@-9{y}Z{pu@9iV0y4$%q;VM&qv(|Mp5q(n|4W{F^h zt96zl)wrdqXm#4imsV3R5u!Lv#4dlZiiv-%wu)tt=@hG*nX(I26aWf$$n#z7%r{u9 zd!338x8HTi?^n2^k*nNfz%RGmFLz7tje)t2<+gCn4gr=Z63+IHqO(zW8yXfO4&Xf%+qehbPpyrsLvv$x4-Yy`)D;!4f zgfj%feQLKUuCFqL1PYHO-aP9iWdDdKcNXpaPOhxUfVze@x(~wF7%8<%58?SLAQ%Lz z!rvnWOHeXv^f08^RE-y=NV=rnV>#a&&9ZZY>&gums16}AM+*W$HnlH%oyQidId7Du zh1>=v>A4B@D4YSV;Ft4ii7JX*?*nG~qYSk?eHK4_pPqg}A;8Q&w+6rU$<(rj| zq)z{hf3sBM=z+8=eZq0MT7PVz{UcHmU_=Q(b`wbQi%024;1tlhi$|$^*}V*Ul67-> zllCDNI9Ojrgrv#RZKo1rKgtkbdQG_ts6X z_1abPFf!967NslVhqQ5<+YQctIZf0btLXgJ)sLg@6(F(MDK9Iy@>-j->)guOn;WA6 zulsx>=CmyGitD`Dj+$M*$O-jNPbzQji1GJYV;l>=RS{}=>u62Sa&Q^K9I15Co1-ZT z18e0LtHBSMkEo#b+z$}c1{Hp(Is6p-m3*NN|AP>l`3)vse3`pCNHmGf*Z9S_X88Gv zKT#ux`|_cJMY&sbg`G9gzx*374vXD9*krs4j&~e?`^GZQ%mAbgZNn^PUis=FFM@sU zB6?WyA;s2Y-c$DNCWC6z=RmgFBC$I>8_2{E2KO`%>Gw|^zx zM7_;poG<8gNviqo1f8Hi2;MpHm8kAkOp$awy+@O&#RSYK#bb4#L1x9dNtr@0Vk!8I z2pYa%>Xj)IWk>A+oGK0;bM8F^l}-&&rc(7dqggxWt6)gyqj--jNJte-ca+GJPSHUU za-k)CB3hPD(%I}@tx-@45VV#x7eJ*0rG6$4mo-sbt^Ag_inSZ1ZOX5T;|JH=QbYCz zBnp44{V7WWpsV)C`&nF=_x&V-&;z*p@!}aL$YmoIxpe;BJ}s-I>S;o05Q(NbkJ$pv z`DAbOx3jz&N10Y)QOX;i2chtE-nStLCb7Epvs2J0G97Iofe}z-JBsdJpwzX?I-&Li z=_DGf5kjp$*_Z2T;=8`+M)%_Szi6<|u1XflcH}xQTzUNl2=|nQGABV-hq4vM^8I6# z(mho~EmB20H|gXC#Mnnf!|ekz&KYJU3`ne!2mO$68OvOlbP2_qf1KRpapG_4(=erM zn)_8Hcgi^{XGWPRlEu$o60F=8h?>}pp+BDc z5w+*sZjf>gM=dhF24zu`Fa?{aiD*<-(Fyu;#bx(0-Rmlc@e!+n_<7QmAi4(Nox!6i zvo!MV-6Xhw86sS=)}gt?m<7`nCM!3%xPkd*rD$4+L%dH1MVzzgR%X+)XnESYM< zWVph#58qB93=oFy9D*hy1|`oH!S>{bch}A!St$C=VD8L!>&!Wi2-oH^y*l@WO`gK1 zXWlkVo-kS=AHjX4Ph9B!NWHC*NHH9YQ=LlZiQlN#8ZE3h3ISo8)5yIVOmtyY$Pr-P zGtalo;`%?L9D#UjTX%d&^W0Ved<=&=0i1)_$#8T_3?8#e!DI5!-W2asILcv^O#&l8 zmHzp<>jSO?Cxov|@zT}nD|&6gTPI!gTVjj+yq|08uUn{wUUj#6sj*VX2)&-&T6%rO zt%fEB%j-Re6S^~80I1}UQ zw;wcv4bC3Vs9zO)w*Kn$q|F^}pq@O;J}CA^fo*!~^!rYH{L%C2+^ln26%#XZT0 z4yMUoxMFa@80CJ`F3buxovBh2=&{5Nz5Xjv*X|ob1nrNRkGsrzCrB*ck%h)*%d$(| zGyO>WLNW@=MNZWAQ`WXXud1HI>BvQnpG4~xD59_T}f5d$Z;QA{hRm>}bDT`5b65c$3!xbC$g6`u;d;Rc*nnJ4tZF4}lx)jN6= zVog)h>M=ArjpD5Zl{hHHxlMENC zcK{JG&m05FwF%RW5`Z!qj@t0}{=0aBCbYK=uRR$mD%xoml~phK$au9+$o_c@;7p%A zf7GLWHhv@)6`7t%eerIn@#3C0M5L0VNIZxih>pGpwA;|aA*Pt!uJR0qMPc`xfd zubjvjaf|(vVsr0Ot;e_c=i~;Tq|vwMU%U!3@AdIngnrMQgf9B@`}th7pYwoai#20hM6#HTIIh0J_^~3inzxj0P_ z!j0Hg8O$vzDIqsRPjg#$9y7IV{2L{p!#;yEK&*NjF08;rZ&0HFALPB%PQOH5Y6x%G ziV`l{fqX&-w!R&dc5Wb<pFlEr0pk22s2RRR2q<@mK?BAM;~fsE^L8Dxyu6on$I2@uk3lNLH}As@hTd< zUauZx1SQ9@#_Y>mN5!G7EWX1{f^8r`qz!`aR9&wK@y4DkiKdd;Dm*`^c~cT^wu3Tm zi7jxeOsZeu>{OB$%DZ<)z)n+-O~{71pL>^np{DBc9hU7+-#kb});pS&0he9kB^Q;> z$ZBW!VG?VQEU(UEjUN#T@2LsLqGiSEZ3Xto6;JA#;L5d`y8yl@UB-tdOTAtlY&@DV zWF{{#I;dxknzDk1Tfuf&T9fOp1-8~o)*!vo{Ht?z){ZE7Ot+~K?6M9KPURI&gjwyz z{nd1&jNlOI5dEpOp&API*>P@YUsw+H#9s-lq{BpcSl8p7Dm4O~eZe3u4grF}(>oZ{ z0D~ivR(em-e61&_a6!>*+MuqI zM1izU5fM}GE#-K+LNEAEb1n?&LzcQq-uVVlhl5?CbRBuAo6U?7?^ukW4dbP&UvI2q zreg|(P1xq#5MYxI$WKKw4K$#ItnwvICf}@H3(?>cgk-uEGT{Y?m6Y%Ec&sIqG^2)A zMWRUpe;~;O=M@9GbHiOc6Z_bm zUp@qoH&Tb0o4;b$?1I~xcb zcWt|{L{I6^Kl?<&J6T7-6(9LRNg{6E!TXD`pcjE1&?7zx$fpSKtasoCSxCjw_;fxrR)C@KgQ@sVog>X*j+>I`7Nh{kz>U#~qdwZd>e zMu7Sv7nm7P{XGU62=W%$VL%Yo@PbUp7O;iVdEi|G-wE;s&^psJcn+%zdc!po4$lSr zNE;ql9+>QGplK#Fk!piP<4+%_h;ze$f>fwKldpvkI*ddS0fZ3JV#fm&n+v6(t(*|% zm_1+i^Eo8ii8aN^%lH_CG#mul;M3@if8X(dTuPL+n#@O{>sqD{^hk>kAO3Oh*TH7B%UP&=T z`>@@(Nhfp$lIak5B6YMN1YjFxo5nXjE4*)4Gy+3!cUnx!e&u=RBq2EH9EcAxJYOts zsnmF0z7Oe_RBxxU2V9+pvSZ{M{~(JuAX9GQ`mF<;{b*K)DJfVHMkDk}rNR$S%}i+B z9`WfZmXwn_hujb^&vs+$5a@BI>t`~=v}*6^N5Aj&4J0LBCa`;~D*)^^+}_zcWe3EL zz%dsq=`q}B41y1`@`$TsX)+vLL<08+;(%9r=G+uNDAx&?RJ2#b~Hy|De{HeR8c13ePQIOD!_GV{y~BZ^4^!!ViTqSzrnsa4MNO3Mf00SJ>gQSq{MZ34|T6bE#5ex~v z;Q~KM@@Mfi08p^SYN3GX20$SYa4VU>aUXz??GiV*mM?JF=_#2oV57<3JFqN(Rg4%Y z+tXqIMVa!{dqFB+=^DO8a|7_50?zM#fr}Pf;D|q2YOmFSba(BQn{mo`edYjzPHXdg z_5-hAtXA*a-0ZG`!cV);#gi1X#njL>jYj*V8tv!e``jhG9^{`}!nEu%5}r{V0t3mH z0SU#y==ib ztR0%!FKR0*j?Ur+W<7ey%E5Dvx}JcGea=)8x9aK#@vov5(&8WYg2SqEoyKhH31ZM~ z+iQQ9qYXrrqMazg6jLY*a7}I|8a;HNQRW2kDWXW1U?{J!yPL^(pc(du!U0o3q64W0 zGqOsIcOebXCNT0b74Yk8bN$UoFfQ7j=BbiWOe4@Uka6Kw5&#b1<+Er9MIx)9>m-Qd zj;So#B@s6sX1hy!nhgqP2izP<{;6r1fMPLVau_S(J~BW%Ezw?UYFs(h2)_31(Je_{O%v)iGU*9?u!fh) zh`Mf-Tmw8|RlIGX;)xziA-1@ThKn5Zsh$pk5DA??zTRYUC3kNW{HP8CcIuff30brVq{1#lgS2sVnaCpNkqRX#RdND3K|*k72SK9HNgUGa zvL>d4+|AAgmS7kjYYHs~mY^yEx`2?vCWit$38kXC+m+x|1}5xmyf}cJ^m-#GkWBs; zKh3tqs2OGjx%-YRG#kb(Du(tj{0z|sX$mt-!ma;L?aaNvj?V8zpDzzpU>lk9*^5qK`N zJqRhz*~WCg3bDVp=W82*O(h!dUQ)AO=O*1TC=L5jdcCCyt5aJ&A$OaKbHfaf@DH30 zODwaMKomBEOvJQjoZyR-ue*t!xWC_jVj;4Iz==Rs9FE*Uqs!-JH z;Fg6 z%McCkdeAvQno|iVtCZjC17g+P&1Pf)!z@A+*;A}ByvMD+W7)tY1I-?Xb& z=zbpuq{dy4GZZF3fH8>{%mGYb2lN32I0x-@SrLGvk9>7a^#RF2CK+FT`ZyN-kFbFu zQoPD_C+(8imUFa<5-0MA0(xRwhoEEn%)!kNG` z;K%@8pm_OZ1q!k=C&PuL1gx)B8&m`$jdm1(N_b&mk0ZI6;iwcLl>~%OT#9J-cN@7| zF}wvN^xE7~x#WdQ>tYM+DdwfKne;`Khupfl9TDhNNvt&A;Fagxti#>Qo4YED-{CoQ z3|Lt{*6$;7R)vuD=%@3H2fXF{m$IJ1+lLiu-q}0s)!7(WaeKBq_Tr}7GZm%5k94du zut~e=e#CYQ1SCj7dVtGLXxMJ)yf6|g730>IVmL5FbybcH-E{kke02Y99vULbspg2k zU8`Rq-ym)buUErTRvD!ROs|t`=_~Fjlexf;ix6s1-*CBot+M{P@9v+shME9Zg1 zT|^>Te9Pyt08yDbz(#f~>h~=EE+}|@{!7b@6=W*St@L>8rAH{U=FPbnHvq`U>n%V+ zxf;Dqm=%QK$0b+-PsD|{Yn+A3Cz`;Sr+=#gLv;K*g#FBRUAz3ZZ_f7=?!3D`IO8Kp zx7|(xAIksDsyZBKb?tYzzq?_JUL(hC7fh~KFN|&XJ7Md=uro0FxB3pFZ2}x^p)<2i zXk$x2ev|)7&PEAId9wYId#!o(&1Nxs2My literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_04.jpg b/Standalone/Research/WorldAssemblerM3/Round7/captures/approach_normal_04.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b2148924fc42c91ce0faa2ceb2979bf699a6728 GIT binary patch literal 12981 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 BD~|vG literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Round7/captures/before_s2_cap.jpg b/Standalone/Research/WorldAssemblerM3/Round7/captures/before_s2_cap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f67fef70401e32b41bed0fa4a512c3a6bf0e038 GIT binary patch literal 9341 zcmcI|2|QHo-~Jh6>`NF+lF8Z(@tB$vr6CQ*J|mK((1KE-6lG7#*lQ3a%-FXGH65rjY> zpq=0kV)sCX5DLl7&5cBXFBA&J!z;wc3qGQPg8V{aqT=FWqGDnaQgYG~Xjw@yF&PCJ z*`-S{7>tCpqOzjAvYb3d9$o|iZsq0S72)F(kw=T6<^Sssy9yHHL&S0gBN2)amly&m zhG5@=Fc5@50c&A{zkLu~NN!*yAHRSgm{7h5;zA&iT)=+d0GJ&Bu0z~nC~*b60gnX5 znOD&Zy)q;&olj|F$z4fm^Lyo0F5aR10#ed4i)B?*mt%2igw@(>*6QdQZXy{On~+Uy zHrv{5vES<8x@-5Iy>9LvK8KI^9zEvgA9gbQ)af&4Y3I(<;}a4uBqcML8JStxIk|aP zOUufyU1#06SzU9lwyyqu!-JOAw)T#von76p`ublF489q9J3R4W^5dt^U#6yKV80L$ z@~c}vJo{gMi2=X3Kw7wYVZRVuN5MdfaibLQJmLlvUS}@}#g!p^=#6pdC3pFiR#D$e zx_CDWNGTIusZ7AGaXkBXj)nf8Jp19;Prte$AtVAM4=Dx_p=l=?HfOZ}mJ$5Rh()0( z`e2xF(XeU19p@5gkSWeBjhhh(&!k&(HIqq@#y=fUXb_f(E`#XQW_a!YG|a(svk)Y- z^}iU@;(s*u7bm!DWilDT5@?qn_Jad+3e5qFz#9R7kZ1}C`Y*;hh(bbFVHv=;Uxp*q zCMRvn5|SnkD+8{>bAC4pzPUz)7&Pqvhk@(-n;5dvxHD_fWdg52c$a}^Bk*KPM#wWy zG%F*``R_x{vGZSt8a(^=*!g)rdnW+hg};J<+7~RIh^9VKKWj!p^Zgpx@5knFgk9Y- znP`YkAt8Uk?yoq8kK=>EJuCi;NOPjbr~)9+`iEtM1so}6`b8=lUnBURvWLLdYM`NR zT-$}TqvAA2sEA+L6}DT* z6FqEhE&box{ToQrsV#^yYTtPd9lp{A&0>T&I$#+g-(gS<@L}+05ZV+AlF(EHo}__x zAu@1rQdz5e!uv>^e#MAnH4W!wjsj1jz50f4jtXSJ(g4HMvuao|SOTI(xBJC)=J6HseK%098B$gAP*qI1c|=D$pvgEXxljUFwwyGM6^qM zuqn1y22Ke01}4&gP{I=VXZv8=IbjhD2SMT_4rUXQ(@NQK8VHWB6kt7w(+Vz^?~noh z!X=yw`0N5uVn)N0Li@lEu5%;Bj09q3M#E*Niem5ZSj-KdIs!Igw9_&$s5KJI-&}p`OC+F7!`jg#1q61Lz z;~0(7GKa6dugNM2?(j2zkRWuw5#b)HMy zii@;qzTn}Z{cg4EfVgM^su^L^c$;b1{AK3AUl{$&Fit5V!!eOzguns)E;gLBaSE6H zH~zrF056wKb%{R>Zmv~X1_S5Y2nm+~s)#3lYhc|?<07Lgv52zx0}s0Pc(ybQ+!GNL zA#Vt_yQRD5V*M(!db|C|>CL9@=<|Em=WPwmY0yKd9NeB+St4(aJzauKZnzy>bLbgH zBbrijm*-5AiEN1zfMj36#VAG!z%E>W98FC@6|8Hv;%jOq&*2^lo&2C3<8P53N3mNU zU+>RtDq^M7lAR(NA3u~&RlD!4&)eyeT%0poPw+|qaJ5pB(A+=hlrk)vF|Jww^A$vt z+L!3LPN3i2y$Yb8)s&U!sY}Zj=mR*ylTMR?$#xRhPSMS^UneR)&vyP z#JLqawzr*FUD)}cK{Hi7=dH4#_ZpT`;ogAc{xQJ=PwtpbH85XnVzq-?*YbMiYfYdIMPtwZd+pPLshz@V>Kf?)}i{}kY-I;#3SphYnt!!Up^ z+^yJae*Inp0%sY1v@xQy_;E{Y9jXD@QM6OCTVFBNZ;ys%(xzO+_tv?Od7nPBkt(@# zrNqk)?QDeJx%r7BnSWY_b}F{qz@){jUt95J)b7a7dd95P{_CQ2cIuvp{Lu42tLh4V zHf+Qmk?Uhxqj0B$bv3pipZ>T3J6oh@kk{U9KfKPGq;|?__9pe2MMj;~3|d+!Kw4(b zSdx)9!;lm4rd1Gpui$r)6(c`d_moT}N1Gih7V;^TA8v>Y)X9Id>BH4>Nn+RIJ(wsn zIqivi4i+t@#t(P}ZolbB)fKVZ7#oUk35-|E`-6l|%4~9Z-Nhh_^qMrqSukR&X@>e~ zC}ue*hvwS?8u5xbdOhoHhIo@bEco*iH$2=$NC?j~^m}t~%i^9=nVyzJ^A<(clI+S& zY{*&X;8R+jFnW66nPZM;Z}xe7w9dKR3-9~VweCy%*3e3l%`eT^sud)1+X?v4@ODW_ z7k%)q!|u`Prz;)uuH;-=dIl&Pm2Yh=j;b4~?xSJU2c#<_+{jGpex@p;=&ow-nG!QQ zQVt!Xa@(t&f8?Xy0=>plYq49G@hsRtMr>iNEi)vM2QUKS1LFBiwm5?c2VT6e2DywfvVuZO zbYr?PV^7?(XG&_ee`I>hQ0~`Uh(Nn!cHgFZqP?{S6>2rrwwHM_={jdh$YC~~nf8+n zFa6sZl#A*v?xGmAY-pde%5)&vKSfTaK}mdK8{Lgh~itrl+n_BjX7AGQT)U7@A^c%9IFW_Njbp4nvl(x$^t z1qZ6%bl=dHKhp1ybl7xOx@<|nQ~pl{cO)JiSUqyBK>_n{2O}~l>PR5w`uvQLw~1u^ zKFzBm(pRwx4zKP%&g$R3cKe>Lr~t({OMutNEdkL6KxtvIg$q)xCbn3(Rwmm8v>B{t z)V_p-2vprzCg@;C)j=IIH~90$?N2>3q}v*`jKT6~8w@nwzV<^p376H9eE*3d+2BVx z`(D<91#rSDf7z6Rz7f1XqP9@K?gI=-JYNq`8Y*Z$VUWh^UwfuRkX+u}>ACwtZARclt7z~yp_ettaqZMi2GAR zM+0r&__sM3l^z!%cOB|i-Z|gzl%AHeb(iZCA%R!7mAmG{?)`E2-E4mIAQMBW5v_@N zbhFr}+$hyX$ULC!kuNP`Y*El-+pLQ$-U*41l5czEbk8^2%1#r*W#*6NbkA75B4Hf1 z7?%Fgyjg0R4bfH;4QX))nG4F!#w!I^_DXIUD+xNnhSa>DZ|o)S$jLsezOq(Qwn+k$ zKq5wwyE*SoLVtK{4G5J?!j@pO>lepWpMp{yj#Lj^FsBi9n%W;#J`LT<&#%7}Va5#4?w|`oErJML{yJuVYNaPSfA(f|WOvX{mFgjpg3R%Qs{$%4h zCh|#(n|t!eK~zZswryAJo1Sv-J5p)n6S6HbUv5c@UDejnKc;%q?5)7C>2#k-t?LPr z-TAv)hAOQR*-(0+?wZeWp9CU$_nvLG2}lSU4`jr9E?>Sx|BGs6#j3`eiczvg-C?RJ z$}5dl4(Wf&|9q`aE~U#w&BH@+a3vLo8E4Aw!`Z3Ta37H@HQ%+-3{4HFl}m5jMX@U? zeBBVMHulk}I(^Z@>qiqhXQ;)kO4-WMsYf~kgcVSM@0EseIH8mS*_hhYoLq5`*|X^R zwK*==6G$ua>+kqS(R0o%&r*M;4pqsIt1Bx#HG zOJ`T_05g}<+k6&%Xr#ULUJ~nG*V`tc%6rX2$+mHpcK@{K8|OPd!d*M6fcTja#8 ziKmjLMR#)^iboFIm)q6$z{;yuBXUyi?BU_p`>pZg?w`D$S|{*#JIiT4PU-3ARcgs# zoqI4O9o;k9a+EL7aLTvHuc=|!Qzj#F7*EyByCmXXMq5I2up#TCQ~=^&6j5azOn+{caS`ScGt5Zz0`&23{O1%LxaLhuzL6BlJ$?si|KY{4ky&VBzk>W z?d<7H`EVE0SFU->c(g0TY`bE-fNf!0?y&Z!Y|=p&dwi*WfN#s^k>dID<35Bf4jtMn zU9~5IUaZY|VOp}BxYz3L8Rm%CsC>gEW*(~s>-^4K>V3@gt~>FEuj{H*Omas__+u{E zN;MaS%-(b_^mpsZs&2$TM|ugJ1-O(mw4Tpmj+pEXzz12^tg=fqp&sJEq_PXmlu;G%Lk}6SxyoO*JA_GH)2Qc zQ;O+P>LQUOC(o5{7W~A_bsgEzWK+&f!BuO|`M1d4>h|miwBI)IaiacbM!9wtzGZ)r zjmv7ej#HP?Q+aa72Cul+?61)iRwZnnxEMdHy!Lgz+=Aj2zvH*muNN(n_{eP+6uD+Y z?twei#S>HK7bHuwt6SV+1m^orLoJo(w8Q#%-bu5xt8Spl6e`jvQMm4zzt zZQ_VcVWVet`kY6b`jRim1*EZ-chX&iTsS65AzE{c4aL~icedZC##ASFsNI@RvGobD1MOQMZvF_rfKMFkp=+n#W3Y?Zi7G)!K6v-%mR&+15ow7qU)xH9^zPTZSpw-1O>({Iy zhEjLTouD*UgeS$D(b{#TvO^Z4KzL&&0NtEDQYYb9Uzuu#CnOqxdxfo(z6gf;zvGo$ zaT7Hx+FR!oy-R8jmQlurN{$$|JhE!ECg@qSp@+E`J4`=lE>^8PSKeCFeG!wSWH8=$ z`u(Swk9;qTm`SLlb12EQZlko*n7ytaGq)?w-x)ad;>#KIcxathM&ZdP2TZ01&+6S+ zt#<7A^1+H7cX2)nozf zb)x%#RNltEG1%j?c?${59A48~xr_~!W7v>W@^cwF8_K^Gemjq};jq+RBI!V?;0rb+ z)G;;{H;;>XRY~zzw)*I=lX$2Uk0-f5WDZm2M|4DIS;Pm)hi{~;F^aq@l2fx7bV-Xp z+PtROcNWCmjO#2!*nhMm8t4nv%H*D0g_(B!WB$F{2URw7c_kZq!4s^&C{&3W$=O|& z5;Cqtcv^nbNUdX%OLst6nyV5$mOY#OAzPVh(&HM{RVhi%;x?i^i7;+^{dVs%`2xHh z@zv5c9)-=&)+p(1JcZAvxC3B>j~;>*MJ z?-z0^m)Xs%WhNaJTuiVF8=6TDwTSFodT5pH?ohXj`->YEvmtkr>_d8_v^SY+M!VL> z5@qwgbi8Fl8iI10t@5{BdH-gD>&E`3BDa8)E%~@P54X9DfeQlF=N*F&1N7X^s~E`( z9MxYSOxxdxK5e&eA8XP6Al+3TZm+FB_AZcWg_WCT}XUWuqehPKlJ{6joC9ZuN<73$&X73y=_1tb| z!p7Lc{=}0w;PL8wxty9o{^{13gaD$hV@-*{{`8RnO?Qg|;$$PH&{6I3okBvL=meEz zU!(+*pWuO2OSP)YbTcj_+$%$!f{3?>YKJzD8xNS+8t-^RzKLf;BWe8WSytJ7SZyz& zzG%ONC}x`Q4$m9Z5v;UNFJ)06p;~)JpzONLf|^k5o##=YpRPKEqg^i7p{L%QB7|u4 zq}k?@Zh3y$9)vX6y;c6;yYtrTEd7JjT4rSyCg$E2?w20FfjPtIE1?g*JW7n;urFC5@J{TE?t=uX>4?Wby2F5B;l0ZHZCqJo*QzMA*IqrhcLJ$GO1u*dTNuj$rp4~c#T*@tiyieE4( zn|3s}1xkAMUt3NmrWj2)T;^iUxv^-2M(h2OW^Cg5mk#eJ?E&!5IBqS5o=^Z!3lTeI z^=iM(rZr2WJsy2R4mQlW3q{1RjOPR*LPWX}uM-B2hcw%_p3Ko%mRd*eRg0EjL-J`T z@kdavpie7}`-4Q7M4+w24%e#-hntUAT$=dAsM`A6YOYw7zEZ4F+4k_wEo(84vh8FZ zz3Ye-*mR5y*#!w$oMl7nU!%v~JX;{_&XH-B-8+6?Z^Cj`H??9Jcrjr=LzVJ?_Bk|k zhE25!7d$^bnJY+~Ce*BoJ{2NXUN$v*r*Kopq<>(!>zMe=LfI>yKhg-}RSa-S^ii_& z1))gMy0VTzb3l9tyK_1syF!Geon6%*UWiHF$(u%ay~LlZzO92%v%gpRV85j{<_w%eZo7Y7xUJrns_!y?O-Q8;H~Oh z?eflk-gOy7J9My@0MAx>AiD0HP*CB)s?DK%$HS&7b#{hfjuPLiL03MXsVA!t!`F?O z^$G@%9PHDbKmcN>!C@J$lZ=ko=_1awB4@Rmdymr31IchtEgmWW(gg z&&5r(*<)%#EO{K~*-%GF*v9&dmOy%qy8@tAWWXdf4hIe{%#jqtgC6e>Bsgvo-)6$x l;F>zcpY!?7+{d6=3kPidf)nrjC-Un{Y^c7am4#t<{SR*u69@nR literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Round7/captures/before_s2_far.jpg b/Standalone/Research/WorldAssemblerM3/Round7/captures/before_s2_far.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c12d9259f24e63c6d7af2dac3625dd3208f986df GIT binary patch literal 16630 zcmbWecR*7?vo{<%qKIIEfGABdp$QUt2`!XRlh8y^nm`alil``tBB-HP5v8Y51?h@{ zbWx-QM4D2iD@}U%4nF1H=ezfh_k9B!l5=)vcgk;OcFuAzc<=*s0;O-H4`N_o0679b zpo3wME{KJRnVFf11$bj&VPR!E#?A)3xQ-q@a*UgchliVsoBJfM;Hi^f0SGrYp9r78 znKME{LMKm&o)bNLPVlVI*+U`>z)&_;w&U#V$IpVf!Ds)kUk42!Zgz%v#t#dOL(KrlVO&&fOcg&pDGJ;lc_a9;cZ6ea;zP*hS@QPtH$ z>Khmup|F-#);6}6?Oa^1ySaPdJpBW12j01RFDU#`MC9WqPYH=h$tkJN(w?X1<`GF` z3N^prb$LZ)Rdr46o5rT*me#iRj~%^zwElswgWrb6Cnl$+XMWDk&9AJkt#AC<+}hqb zU8{{>|8b@ihcG#>4<9kBJ+E0IgKM?b}$= z2pGM>KDlo)8Gd>)oUYI`pL)v9dveI3tqM8C-SOtnb&U^&9iJ)T*qYc?1;S6n#ZljW z{LWZ^m(ZQ=Z}X058=s2p;&0EbNZ}O)%5C)|Y%$g(0ZMA&%ho{~6HF`^kbJoz9MHcl z3WP?2|F>q#NPuPotpx-|6QH160<@F`j7Ek)a|u!mNHE$FAn^FgFycri2V;Tz*@ln*^G^}vN>}ra(r#BS6xR0(DZrKtd*n) zDz4GLad9s0w>0gC+wZ@U+{QfJtWYI$ja;>C3No|T z73{8@HhLlXh7~b7jhCpDnJ9}vI%Ju?i8~KA$$KN1^{E)E!p3|enA47y@ITlBIY*MRnvX2`6e$D9@VvA%*p{`&43KNG zb1FfK(K#B^gA6f26YO9i$$$o!%6G9s?;?NPCh_Qe50cxmzUS%p&VTip-W9j zu^~oHYwT9P?D|I9PH*Y5RFxMZvao_VurNyPm3}@;V`=k~;w=pASnA~yD+wmaPxZg$ zU1rwEma&Z}a+3oA_VN4X{h(zZ%1>+-G3tw374S8d7e9V(Pzy zXVxGNJyhU-vvKx+>JX4T*y0oiG!M)%4oJU+mjMc{$ju1(4rkH^r##hd!i0C~!*I5D z#95Pk$>By?%gVKR_o#!tOsEgOi+jCKk4uPpfNfL_a?`F#6+u0!cT@ltQC zRiWYE!3d1zUJin!G5rI_&`T$?%O3b@oPb{{s!G?SrvvL!$IOt(U5x^b# zrkdQBs=XYrW98tC0&NlNPD?gc;%EZaxx}OCmOi^@Zv~BASgz#WX^6U?r7|GnLXV-F zrNttQNAr4J1(WFAv-k{OyDw3}B*c#1{hSNa&sDH=p_to&n^HA16^`#&P#+_)A263V zmA_c9CdbLQh)Y)WtINCGJ@&>cY{1#i#U-t43okLXarE@3BXxzJ?mT_VqwJG2dm~pq zy6RH0ox}vePGZq8`4F5a6D+kw^7!N-?|FbZD1n^;!9}q&x9|ZDH}``t%;T?sz$}0c zvSk391#Fc7JsJT3z#cHgf0<#64D?V}&=xgz6fmUWJh%ewcoJN5=xqW2dg!jx{t1|W zgQQ}S5%A}7z#?G2#sn7M3M@5S<~$z>m@th5Xo@LMGzq+_LTqui7((3!gGMme6(gda^AqjJ#paxt?&WL7kym4^ z-}j$sW*wV{XNvU;y5ctq#co66!_gg9ZCCHQwf;C&T64pVK9zNe9&E5+TRn6rGHdN=PVQlXERh^pLzciq7n(uqG>>ko} zbjulb3oQe z%9%JnuZ{rAi7$&Er=u=Mx$_O;%0H+xAIZ79*5@}7!;D0N|10qPcL)5xeg0Q`1B~@A z82-DMwMrBTw*h$Mfh#P4^bT;-Ah~~HLHJ*0o=cE3VIrc`gh3gSv1LYvE~X+BjB^N2G6qA?QpSdov7tnG z+fAahktw`L?n8c~jsy=*2~)a!<#K^#jaZ%)CykZlG%^@TH|*lX?iUQ;H@ZXcb#(%b zYwX0eC%>>AYA?QDua18>GZp8S{jGzFPPrcaM_IJYdM?5wJ^Yn{(^hZ!nI4TVp)UTX z*(Z152cX7J8MT|&%t`(Nv01k%ozo6_Hi+AgC7Nggi|`xyzb;OO2X0)5$Bn7=C}^lM zor`v>6h715c68%R!MIh+x5OXmZ%ae^>CmbV zrOpTd>|enHGm-Y_&`|*a6YzZ)hQA(+`LFBZ0TiHh1gS~@{Ud%Jj>VoxuK3qbG@v3m zV*>MerebO6f|mUp*Lvyzb^4mK@}EE9xbX#;Efwmsq<@?*8(+;)-pz%9#gGs$BE&oJIx&mE`Q_j7N@sGEff= zie4_cg*N*`yKpnq$k@o*FptDWVhryMJz{KRtaJLrMzMaZc(>!dlfIZ;GvC-7QX9qK zbF&UXhJ*Vsjn?Q!IV03>TB{}mj7i1VLmVhb$6o_#@4GGzNGF zFG@Zopa%#RDilXmj0%x*wj!n73-E~+j2HkVT1N5(E?HeC(lC}(ukB^ZbMcK zw>hzei4O;xN%!EpI0gyO=hrSsh)b_1ZjeNaGM|BGOHRjwo^vqjewzGkW+(QIE~<;{iR z?6(uYR%jyly3 zfflA`)ZH2dKRQ8VWc9ZS+#TqC&@ubPCaU~265&DO(2&?Rnh_%nc>>^gkUPU)J@(9l zG686&HqslM1E3}l(rio1G-DCdXBdC2nY@A&q{_5c2`CBxXp6O&alIlCC$(!?lM8$n zTiu@vNl?+5RP3qBGCu6% zeHyo(Y|HAM2i^mGrCM}uhCa+zMltzz9{6|#Lm&5EzMR?3`VeA?yssRvivaWuqzlZ% z7Bz4(fcGA)BSwc9=OnhMCWf3gL~6!&GjWPg(owqH#|H}k6e$<2O5At<&|;Ecl=@56 zT0Q)y!mHbxY`w3q{Ypm*KIsIy;tI|=k<;&y({-ii9`8H;DX6Yr@N9jF4{GZ7eD`x_ zD3cT*DS)G-JCV=X_c19{trcmP@%N9;CjTe)Bx@ZCSJ-NMQ0$;n+tKelL~S1RTmfP`KLd$Np& zZbB5Z{qKluX1ho~xssOln<)&hnq&d!zZO5Hz!oAO0G3)ZEZF#WD{%<1e`F(# zj6y3vGjRn{H=x&Rza4ucw$ zlm{dkXk#SP=|gq(A*IEk4D3V-MgW8ZQ2O%9a`}yzk?`Im0a3#<SiDR*>o?U0 zF+fYLGm}uO-yj3R=a@;y0l#4~9^O^k?|vlXCnH~Dvv;hkAGZtCsf7qHGYjPuk(RKu zlCa*h6%~(*70)rI#$&oepQ2PTnAl{I(EMyb*q7@$9??n2Kvd2no$^7b|64HLX2*F2~%K zydyS?Bj3@u+_iVC=d&QW7?LdRyJvm?3Qp&2ewXoh?7 zax?4tHpl(ywyY&8@V1XvrK4*tB@RIMVp%wEe#-cg720WhZhAL8G}hF8iT}Y9oe;dx z9EwMCRj4C_=ai53NMHJSwqIEt&(x0V>068Ryrd^@O<3OqXSIfug|EpAkql)Nf9Th2 z!fOY&(KYyNB1P$11KO4sNYc)O{w8mK4H5)=2W+th*qj`i;-ryQGf_A;4YH)4sH`T`dMT@&1V2yzSmu%{*`A zL-#Fj6=7R7e*jt*cx6rvkWNZtvGA$${IyqFU`nIqlu?RB7R=y%mLlYITx)tzFGDxJ z1pMjM207!@PKS5bP9I>6kJyUgeVwx1Ebq94hIwmeT|xVtZtaX6^Qx@E4{zg9YPZ$= z=R|>6kRO!ku(%Q)|N8aMugtU!$sCBtUw3o70!Z7X+4+)l6O%0>S&5JL_3E|JnJMS4 z&7a=`Y}o2NFwr{XjFCURVxI+Mfa#)_?z62@3ykUq9x|pq@_AElzF;F|z5~x&upC}~ z)muD>Z>t#lK5n$AP>V@9!X_4Ogn}{~_~i1 zK>GB(N96?)jGZN*B#vfRm>7*?q#XsDQEZ%?xllS4SIh+_TxxInoz03yUal@rL>~X9 zx0LWPn`6G{GerB`I%9E@bLZ!n>cQKERe@D2#xp$MKtC+shImoi;4c`Joeh&bj~%Cz zGX-N)+?H1^L^)qMXP|OUkPfl59Le!B)o{JOY(8lMQJ1~x@cHf{Tae9B$g)%9(nH_r z4$Z|7Ji;z_==N&aDy@dTim)4e_A%xbn3t+l<;NGkq!Vx375f#-=3#wpGtD{GV*~nd z{oba<>22#eCA|l)slE#%mhS_E8mEG-vnrgY<%;v_(|jx0{1&3`TesvYyi}`ZY%6;C zP$w^453$WeB_vN(Iei-*?b(T~iNf+pXQkOC;ny z!hf>gXHnw*S;&o=EEBFB%Cu_|pk$*7p;gbM%5sJNSaM|OAx04yCh@IJ(@bk5-@!Z- zB+kW-6-x6DHMulQS#h7Ou$QtShdX zokq--(&2C7vI+QZqRNUJgB%=@shaLbdwYQZ@Fb|0pgWLkA*&%_i=Q0x$)?7k(ivXh_CpZG;_P9hHwPg5hvD0n zRti6wzyIdmqcRGl;y1EF=vEL@KRMw|3p~nEfj$w;wN{vJJIdL(Ih+mz=Xn=|U43>) zm+Bp;GVu>fZ3YU)#T*yJX6MB%+P_<2wB%@HFvO^M@aDN_za|Lo z;x!@3&~@scUu9Q6-ccFo`;{s$W@iGvt>&4(Kv=L|HJRczp1IQTt)}wn@b2(EV&SH4 zz^;6X;jkd=!Z!BC>nk^`g(Q9md1A@K)uIreE%t&xvsXJ`K0uczd<*uxJk`ph8BUnT zmkVn+iN`Iz^+V8(-N)R{6^x#YQHHhNx=|<~oyxV$pt5YLj0^nXc%?)`9`LDoL(MAu zAHDw&OWy8^4{n4SOyDR6l^W7Cdcb|#$6_j~l2m$AC1SOuZI8Vd?__rX@;w0kDtI^` z(*DIYfLM~Z%S!WKi`#-+_#>UQX?p-_nEg|BT;Cs@GkBbjFn9c^7uQbJ0qFf4zHG^t zPNd`agEWee?O$%ljD94?-^h26VBzCVFbudKIA3f~sonnNDq)^A#;g8Ar%11NobB3n z-yf<9|7XmimpiT{V1YOsn~*h-vQC4A#260=Pq|B@SOTPTTfc2z(`-#W!^7fK>x$oe z0lsheSnQkzoTLJX~cx<6<4`hdDZ0w^dUKmd%vZD`tksjYd~KiYKCdyZ!7IqeB|1JANE0VN@FhABLa$1b{d$LihzXh5LSRbHgvtGY?Q#=mjL1t82G zHYTiAd9Q1?eute{egL`(ql>A~4nRxE_#IB&ksdGiZjbE#OL{={FNgCl+_dtj9G>@Y zdY2$ZsS^EhJ5gCXGainF6pi1aPRrpCmdiB!KpQ}~ZG(8J(zedt@ck^OO`%QG&nS9r z+=7YjxohjTFZRh0e3PwGBG-=lJ`$5){^x=BprOH>%>xN3g1 z<+wgV;E7cyPW_$r_`Th4KS!)ogPEu+y_I>UJ1S27d`jcJuaQ2pJ=;58zbDVN`fkii zxWdIBwJk9puPJ%)F;Q6|R#fvxSGT39Ptxj>mF3*1>@p)Cu`W5f6|}B;UAR9oqV2aH{)Ym;P1jy2mcFEx zT_%)ubF`fznHS)@)pr28%Q~8nG%p5k*tL12gCB+4gQzzrf5Z8PcejZr+szrd+C+&4 z@f)iMR(J{X!^>S`Z1b@3(|rme7r*80xV@-70M&BudDPhYq<$Z5Vd2}L@V*e#%L=8A zU5OCX(@b9G6%^ZfXc;LVE0;ym`I>lfEF`Wq{u*pS2w|td4U08#k81)v1WN2dfXg;M zM&V}eGVvjN#os5^A311?a}!$q*fnl6lOm?L`p`d?@U2FzF3wU_s}mfF1+6rH$97KJy~06)!lus zUhK;#?pR9U`<`wpocA)|-yb;upVwwS2OO*luDl>=ivUyoK=%7xF|kd~SR78`kzzWojRfy?v;}r2SFB#?%h=!VFIL-kpS19F z@t&mJmdvs2Gga<0mE##a0JSybs~Z+v%o8irdbEE}s5cK76c>u!dhY9gb9=WtRzueG z5SQ0209^9?vp}Jh-3>h+);}tzYoMALDZf{ca;@isj|z~>4+=%Vyx683u06{;5xJl0L%HTPk`R39T6)o^>?_SF7E`HqW zL>(je6(Mz=In{?{UWkd4Fqp*1?M6Oy#ctRIJ>l9bx7y+G{3x_J7<`Wssk?`ImY&S zJ)UKeZSmf3tgycx@bt>QRV!Bxd=1hq^Z+pB&x+r^Om2YJ4e^mWcmWv}gUHElnpAaE zU!bH7N8L>)1EIAZY7HO#`j1(z3D|>Sp#FXUdN5F>A+(lv_6IQE=h!Q;(Rsh^p4;he z=Cw`Q1ja4r6QS=W5E-ZVZJ`?0k(CiUC7dWgV0;hZy#=Z#wN9MTl;5-`IQ1dk3M1?) zfQm?PgiNp?-O}L+FgzwYd#->D$?|%5&8&z8NIcpY50tyXR zL)-rmF%PRgoFo#Z@x`>&W;R2fhfe#bJZ4_zta92Nh+_U~L!ssJX~mUb3Enp;r4Cis zqjx!C;&#xQ>!zP5ySefH@>qr_dhy(Ad;!W2h>-rvF!2Kr_EZfV1jH-sg>lno`m?;c;S;7MUzr#9LOB2S}kN&N0TlZ_`;hK;;1#N z>Sr2IrD~StHPz&SSjrjQTQK9p09CTqkc}Y_-AabyMD$NL%eq5u?YOM8x$RE~?yoCH zJeM!8Qca(=Q=SZ8p+l* zDqh^e{JkaO>`am2c|oQYo7?d({XA+;Qd09~(jG!CeLRjBNdF>N{h+5DY|DvI1T-v- zTTl{|RY;1=cNtSlw?5Np^#ZqR>5#Ltv{&w?*)`7P>3Z@2Pok2DU)hSsa<^c*MPRUPg7>=d(I>v2|ep@H<< zEN3FD?+$m8Z^)fK z;~8-GZEvZ4<&0L4B&Dao<2xcy&&Q2V0sSB`Xo76pz3yaqy~QL}U-M-z{9!CYH3IVZ z0UiG9MU8ko7stbjLi*g^JP+ai5+dcaE1e(8_+@;*&*0;Jw`Upd*(>;f`-W%~%ct{V zh$d6HwoGzC>a#6}2&K-Nt3T*q+oNvEy8_53%YxBvg~0_*0}3SLfn!Q~cvgxVs|XNi zljEkKue2t4fahh0rQ5QSO%AngMt#!A#bQ*4H~H%N>%uGTXF1JZaB?I;`IZNxz#4P>J$B$#IAr0GrPRI$hv6a z4}6|haEuZAmn;?F+pKfr=)2BSG}l|lhDPo)82KT3yt~TsrCGgz`aAKh&@6A;NbkJn zBjW>*@HW@3bK;=e(YQ?s!?r!t3}T7k9sgMgvGKX5C-hAGr*_2L3%o=aU;6m<2&J2M zpWFD@PZG+>oPCIWf1hczEx-D}s{hQBVK>#~HlgARv>Q3k$DdrU9!Nj>#5Gbsv~|Ef zNNCP_YP@}ujI&Ywv=!E`p!9}cs^+;NlZ3&UcM{FrCST2>z>k*IS>V?!uKSxRlpTK> z^k>m}v^o={j#oX|6qM)g*Ce#tdwY-iGw#;38*IT;p-%l`e%W|&{jc!@5J&tL>UZ$M zCnvzI0!L!h@5iM)4>JG0hog(zn=%EFyll4uXIQsO9DT_6#v;$Fg3l~GwCW;-L#E=5 z_6h`_$pvhAU8_F7DHlU8c8$HSWZI86)x5iT9{F6F?K*sSoM@_4NSMQZAtP$p@)T(a}X>z?J^?WsbnbXiIIxZ!`KwhHN`+bHJ^I4NXU-q@P zIDY<(nWB4WM=ojEcbe!Hv+nBOKWLY7%V0BM=o|dXT05Q7J8+CF_ZyKDah)| zF4Ameu3qAN`_MipfO^KoWq6HjaO`nGdfJt;MGrMw%Y?v9(ugT9BU|-_TtdW>>*Di5v*JOT_s@$f z0?yEn-m>#)1+SYYD{mC_#*#C|IX5S<8{p-J29+}&rx=ho)4W~joR5bJx=4kBt=}l0 zdF2NdxyDJmcS3s)qU8hEmIAae3zw9OQuSf=d1*VwD;grH`N5B!lr(~;NKM< z` z-VFt&_Ky4MQj+PBd~u_mxN1b>jf+bd*aY#)N5nfqpp)MMQkKYhDNupqn$n7*r|bIz zkSm(XAw#~}FBKFXo0~3U^(NGOzbV!d!>=9`f(W7*Q(u%wJRzK=jdKKgT5EX}>U|HG zT%mZe`{zux=(Nrw?mz%cu$wYq2YhhChefH5O;k7UZIS z!(t z<;Yr`*H`aqw^V(Tob9g|^k8MUQ}8W>=#V$liQ3WabU&sURCwXs(vN|yO1+=qzqHUV zSx8H#k6XIv=IU3yVj597u6+*LUZ@x(ohtQWRhjWc0Plt z)jp>h*R1CqkkGSY4c&xxa5Dxcph+9u-Bu~Q)RwgAucJ$E5n!;F2}T|jd_G=NXv)jR zPiA#$9dcBXc~_3&U&};7zuaTZ91v3!(vczIU z;AI}2AVUVqqY-8NK)LJV%p>6Z3n_b+en->Z&xvN$`L2`q_FupUUDw#gL`lrMm}!@q zo_d-kK_G&8x6fWRQyv*Mm7zL?DdEy*O)Ebe(|OFm9y5LBBgYQm=>&Et3!IU^jQ`fv zn-VsySpAcLdlZK%UCt}{)$zRc%5tp`+T22vI}3Fuh2E)A%{9TA;MO*VMyA<2g$Bc7 zyeK4lgP7ePebJ~OZbLWw)Gu5R?#rj%-Ka3NsB`aw+anpo?#w)cHqAs^rJDc2qnyzD zeJ1S3EUJG`09!l6#xctLu=uOfI#66_$ z`E(`JgT}JYmr56LOtQsu0Y5z7&Q0MtHC-k7b!^VeBWrxEGg}^eJ{d|F>|@|via=Gr zuVkq7L7A5;2r&5GY%5lF81Ri4NEYjHtR>2no9${9eNQ{PA)2ymDtUZ*(yxXbl~5Dx znKL|#W8en~eTia_qlcwfroYrp)C?opO1}OHJLWr6qI)yvs4S(8-QtqgrovrgN^x1N z{=IW;r`dEjil*UFXs@|#bE5b&aR@y1$n>$s_KY!|- zNkMLkoWgydt#l&6Dw*N!F)sKpbuxA7CisMv)`vE6vQ=CzN!cLl$KHZw;57-+q|Y^C zU#<%W*azfW=|po>`taa+2sOM4LK0A_3lw=;c0C_iOW!d05?(AE+%}EXVyAW}Q#dD! zO?fhB$X27YhslxF99MdYhW$bP841)mEh`NckSwHal=@BgtaAQ0<#p<5{#_coOJi`1 zo|auzL9=hC!uW?y}SGd9vGC+E7Wj`NjbN)XW{&F?Xi(6$Tk z7tBwzt(Ocf0>v{b{aXyn!pA~W8pQIu#<60@{LMTb7b|^gE0zXf3YvZ~S-h)P;oFxp4HJym}bSA4VCuVS^u-0tW}{hS=0VZ*utTBsY-@=VGd_g@Mq{$~R*x;p0* zk@Mut^PDutU0UeJUs=U0k(wR{APMU;?JxGbAEq3Ay(0}2!~%ZwU9TF^nDbz9TydYV zzaMV)?I>4Dylb^w3l z*o1HoXT3KVw~G-d-L^8Hw3?2*IDvtha3GZep4T&=7-Nqrpj@5=bp6zyzWQyak5PlN zW!tUZvh1lXg&09ZT+HCwG|X)f{fvkLFU{f~ujU1C(%k1^I>TpoJ-y^KvEB3l?=Gt@ zV3%!Cy~4EBGewRi&|Hk^b*N4o_q3Mex(l;~GZChXR1UyQBNBEJXSb!Z|fBT=&o zf<+av8ggde3@w2}(t39nadk<(WZ^#kvZ0KKTi@DHk%sfveS)lq33hQhFQDXDRm)YE zY6X6>Xx-ziG_1ZFN6J9DEEmf0NX7mlEuU`*Mc_mT2N2~rd@b5leqpL6$I?#?q%=0) zSp7qR9D@z}_Y$=ikc}!dwuw*ucPgk*4` zfWR+56mJk)Y^)vE0aUJp8k1j7?mKW$%JLyxK~ks0Ftxj6q6KVMnS7~K!=u#Rp={TJ zI~bRn(IQx+64I*SVbN4e@ijD+v8druBRrjqcoT-;Nb&^Ej}(iUcI4^vLFT^nZ(mh{@rI4kR^sOPioiagwU zANTJAuO!)d-#B_3gW%BiJ~4}16S@3+{`5em5>QpP`YwW~LrCa)#Pn*x>;r}MHGbm- z0p~D&I#x@6J#-Oc*0o9 zV?S;}tQABmstw{W7!D*#?sF#RXhnV!8g*-CjWrB4SUb7QN{Kja_hf$1vxY54L22+4?!7NT8f99Vv=xG>99bUR z`@Vtp2y1Epv*E7{hH(@lvQQ>~e^B!L^MPD(V}Iz*rxEA4oNO6Amp1*qxd>Y;f~*GH zxCv7Cm#OlG!mZqN+*6JG5h;wyA}ve7UJ*E#L&FC}d17rclTYF$T^Z*~Pv& zda0@((Xvg@W=s`4{;uGAVlWG%lW@{IIZkQDq{?hl3Kdf~XmF({dDvgDfc(}f>!P|e{6lqW?yOYDu)pD1xaP*WQQ69CpHx1QrHw_M2p)lft)9ntZb>wA z-w}^GK1~%_Hnp?Jw&Xq`aqA-?lECK3qT}|HBvqFwAr-o(l4o)5dkxl9?)lqem{z_G zFANRNNb4==mxs1Vd7e5ln0{FJkE*692yDzy20IrB>e+1Y;}QzXSWM-k z&YVqdw)$m^vY1J0AUHGD^)5|BcwRL}>4GY1NT9xuPRZCN7MVUm{CPei^WBZ?SKt{t zZLRip(NIi0r!3_i2xOs6oVr8$gkfMLU^0^nlLoS?qGFqw?_-M1LyaoXw@N=_QM9)> zj$THA8xL;er-UED&=&P#x#Za7bOGmw&WRyo6^l$-oZ?CFrN>|4_X5^=^Zb{L zl7=!}Hi=LVAjn+KkJLX?;6RRVGiz56TZ@tCT00iIPL|LX`mFp5nS09RvNi(#=(jRD zmbNvnb60yqz5jzJK|h#nm9of`o%_L$B_bI2ApO2CjplRdRZt+L74fMzPb6)xH8Npj zuP`o%hv%M~coe9Bs_K~Tuh?VuEi_c8rDm;DjbrNCyZG_DXDg)w=j-0O(mp80N+?Yh z1J|FZNt+A07Ya}lFa-FK3I!92!B zNCCyc(7>3|DtxQ30g<9B6@A|qVptbX-9VNd9!W3#6&i|W#+^==IwcT( zukeVEke$^dCFAz#PW@RNSF&E5TZMTiGEDBURr2_Ga7vrty{8m*7d)$$%^4C&Ov4TflL?t9de#nQ=cCq|iBvFD?*y0POfmm3MDHOh~ zo5pTunwycJkCbF-UCgmu7Q931=zTTDr!iZ8=F>?-Fr8`J^4Q|{z&!PMhq4B`<@*OH zWtD%cABj7*|vK)kVXbr~$Fr$j>VaoNxPGNT{RDHlP=qh9E9wN57`y zztQmQh36yWrdnk5G~INkLI*MXV~q(@p0A{0hMqy~6ZH#LWjBa}OZ_n_E>@eAj>g$1 z@@G#eNEnC(&jHKKJCB&Rl^}iRj})SlCsIqT*HG)1*+gkf)uUEV zR<{d;0FSnJnvP|TnXs2hTG2b{w}58jQtCaCn@GB@S$Q-+FU?wP=-piG`xFU^f^ghW zdc0qXm6@l7r_aTqw06%|eqIuo*U?x@=PUxN)}Da-^CfJ>J@S*^xOqvU!J2|dbb1!w zl92(_|HP9OGj<6_7MNWiq#Z@`lK5a3t4EG6v34@dCA!W;Kh=a1faxoeD`NF{1cO>v)3qkxQ3w(efAwnH$w4CTTj1#Y{w%4Hj4u ze1fVhEPc*gaASYMp>OxF7shEyFmZ!@N=F3|QVAwpy?GM#s4PJ&zlMY$3L|i;yLSm; zce9sM!`~P^tK_ks=RqMjR4hw!FWK=bjA&NuS5P&bHpr|JMQgJ2cZE8NTRgS4V?2sj zv>M}O)$U^-N#P&St?Y?w;K@f!js1g8ZFZ?@fxr`z0w3v+UCJt@!(8s9H`+@4biqRF z_fbTO^^3T11(fIv6cv_xwA0Sj4G}=M%)fbf%g!)$@KeA{Ma~b7k_6za=#jmGW{GbA z5ps9Qb4u#0Ttt-?rt=)4+=J61bkHyu9DXeB}*|bmef-KZ=2y==SjE z3G9~Geir3rfIxnGtU0i1N#VCF+GeY*5>_!Qo95HnF$W-ELVK#pb2}vD$W_n2R^Z_w zB1Ngg2are>)StWUjEUIU?0D>FqFYV8D0cVpTN5zjlBY; zEsr)C;%NEo8<6i?O6+%}gnKrDQ48*t0ZE*=MyyM##4k zStE?$E0pXZWM9*ne(!nz=ltL6I`4JPdFHyGd1mhA`RvR6e4al;f4&1m?W}FB0bE>M zfGeC2;Lixa62Qm9%gf8d$2sxw@$m}?9}?gkB0@rkg~ddU9TO7~6BCz^IW7*A28oGD zDo9Gp%F4^jiyv21R+Lkgk&~DEy9gI&ssO*h(L;xh$^pfIa{r%?KaBvfLtN?HF+5y~ z0B$iZ9x<*z9|7_J02dzz+P?t*p9dE=4=)GGLx%;0I0I@#0o+_XJlq`kIS6n@M{)WA zykdOE6m-n_#gSeDiornL*o?wMN)}ZgK&ZZ7%6i@*afbyZj!Q~OpHfj(14E$t24~J1 z8d+MwtZm@7c4&+<*2UG$-N)C@|7rjZ9~u@OaqIS-$OjMO6A~XiCOpZ^%FcO8d`2oN zCR3<1I-}%OHM8b*ZC(AFrsj_=t!?ccoveQLz~H|_UxvpgCa0!nW`E4hudJ@EZ)|RD z@9h4?iwnT>KhXLw%>Ea=#5j0ybJ)Tw@E0#G?pvJ3BgV_8pu>O694X)xEUu^kT9)@YDwMcNOwP z6~)E_k!F0HCOcD4NqV>@>eZ(IjK*(0+{`N@y(nxqD(3d|jbqQO`M-4)&RPlGyb+c2 zZ^Cwcr??<92BwXZ#V)y*hkN{PX;QlU4T}OR-fjGdXc-T`F4`IDu<|-i|G6@|OgwxF zuUlNknA?zj5BbsTvKcacS5JC8MatEEW#ItV|1v_r;?^;wWZV?I3&y@@FT*kANY3O_gbD; z?|i4W9TnE?gvVwqR{!Je%Jng1L+M9kT5CgP_Sgs2AE7Sfcgn#`q}kN>@QTSSwQ{(U zoJCni@?<*f%+K_t&;9E?AP@4I6cbxI^0A}(3Qv`636FQ|o%FpI$j-Jd0(2t>w)aYV zA6G_kI0VgB(l|BsiJh=Z$iDght^5=|8@SZs8&E!_S~0y3!H`t8b+Z63s^KDE=BP8AEEzr=k+t=}A8HYb3mwj>_(IK92o8s?NT}jqyr=6oiWVGoj{NEYeT;f0vIgow(V!JK z53LrZf+5xxZ*e*(r%~hu7yy_hZu=jR<03FJjuy6&~CK&1dnA)T>W2>;y$ekC~ zfR#VhT=)kNz=K{aGQFxKZRK|S8eOqiqBpQD=lt7+!Zgd2cNUMMWq zCgpLX2W8`)a1DCH$5@1he>;8Q58&L`YH`Q&gFB|b*PIKDo@rh?d;NM(oqpj>(S(!5 zFGJ_?5hGBL^A-`*0AwJQ004s#Dr$hDoG1TflSF&L0R_Cp zK&BJ7H^E(vOXmVil4H|!U;qWqEUtk6y>I%D5UuC9dw~L<6!}(IhSZanQN#{to*VF^ zhGv}l#g2<#&tJHgM)VUYjwnm7D}56-0~XlAyY@qF-&okH#@)KM`r74Mgh`9jdlrhd zIBp0rw76KZS$d%QdiC@KyI|aZ{L#EJDe7xG2mOVU{`6e-L3nUc_}QUOoANXF7W$sA=+lh#reU5x+Y^7y&f|_gzhU}dqx9&S{6CHN zRWiG7te*b8W@CI5gOw0vbOt-@>0C}8%XYhb=bO&5Rcpn;CISrGjMz%c>`3@1HmoHwy&8F(ZHd<}hL1hN?9gqC$ zgK{sa^X}PA9m<10lA5TF@-!9F^CeaBXW7Y5pveFY+r~xYRz>_hJ)OOO)6e4;ZIo46`T$>*3#;5U-mc0_keiB71GfHZPAG(uXcGa8E zdr8$Px&i+Okgf3su^zp;tP}<8f5T%yX!!k{9`UN~58&Mq`7e=)`#X*t;vmELAdofO z)A@#XZRhpU>Jif6don`cKY-;2uwLNYk$~pndEN8<*B~NT4-|rW**YkYVhU49DyT9; zVq5d0hCfH|ZQ`0Qu%9mt^>EgkNGebxsaySclQa4pEB7&(?MVIBwpC8vr@!GY06J&C zdUGR(mA`$MkqLhvz2jB;dxkryK(8BA@&>dPuKjZVXqjpv`Oq1A%G*R>eY$H?G3cLj zrf2rofh*%3gg=0aiS5Ki&~X5I6NOtO8Q3#EHAvzv7s(pyv4qn3SBV191ETid z6~&y9(Xw6Vc$sW}b@dL@f#I&PUp#18dE_5Jz6&LcPf*9DHIpu~6PCG3k#;Efsxi$W zh7eFqzwmbwWAfnKG<~}N=A_hJ!^Vv-B(1m>4b%krwx9V^0!*%qj5h1mK0yFa2M<3d z05&p?F0KCoyyE{6>YUs!XBWRKoidvoUG^-oZy~kyU(FgSM5T7u+4@bD=VbbUAw3^i zBE+V*b7`J38>MSPxB`O3aqV|(?^ zNghpiol*6pX8R=2m9HDykj9=vh!@}?6`{Q=|zfCUTY zVzJ2q(Z9p`MT&YQP71y&-9g8}#(*=3_s#a2wFhp!JpVk8;6&1nl~$v4-rqQ0j;!Z| zy}K>nY+V2yfqFLaDRw$-FtBrp_6K3_LTbOIIF6egy^x&t_5mVe%4aKfA7T{{-03st zD1^V8u>nj#hMw{B>?{fnO*PzC$29YwZJTxaBy;We@*v5(D(C*d@1|%$jGlPHL;0o( zx%cYr;P&L`G*hI*cdPV|V|S#^CnPeHwtZFSA+23UogK&Rm42t6&#K__e?7AAMqUm6 zSKl}2_QHkCAJGskJ`1tCY=q*b*Y3c~ROqq%a*G4hM!c!G!*}O3Vp#fp?yTdXPd*+% zCpH`21+b%}QwHAx#W;R1!O%25ZPs>r^lDIFhkkF_D7xa3K5Pn7hc1? zeQ#9vYBV~MY^!Aw&>$q0B3!y}cb=M3?ei?bgzp-EMo*8lDO)gN$njh9X;$i$swXkK z;!6nE$92tWr89%#?NO8F&TF5aySXhzeSS7^ zzv|{-`bRFCl~d3TQPTy-??=wr2;O@Km)t-*Iwv075$TKt{j)AGeJ7fa7FBHG6Ct;N zZE72a?lVGDJ7A4u|A#5%f!iQpY`Nq98`a-?^5ZUR`QzyAzL@A~;{K01(7zpRpG4)I zfkkIS^EJ6P8X1o+uXtxCI>(3;OT$UWIc%_CBSRpU6lYvxrK8Qpa}u)rNz6 z34nCrKLGh@o1CfWitBsc#e&iAY{u;(wjv6y1kRYQekoB+aQ=KM{kKHky?3i7(BJt7 zktRA~AY!s!dlX@&@UEIvwX(L(mKo%m=H7*qyZ!%uYWoz#Ng5^8Y>QnTKaC{smOaF% zHb>qujfkf1{>w?CtS7(aR^PHuD;6{)x=Ce574~#1<+m2i+BTlKshiOwA0OeR zDBolXu~3o)-pA~;bOs@=o1pR8IYjPuOXDZL9%4wG-Yl^O z51SIw3|+Pv-#qs$NP+Avpm0zfdSQnJCEyZ7nXRL5`M701MhYgU;c*ebW_3Zp{nmm6 z`IcR_$hq8{XYbJL38I9M?eB3!R~yCpo!15}R&^@{0M83xOg?d5cD96@KI$K|*&y?M z&@qj|9Do#=n!TX&18{g0pNW6lFM`H#P3Y0+fjWJj<}i`3s&jU#H!0xkKY+JzU%ng0 zrS~!Se}(gtuf@If<5{5}^k;5WZ=*&32A3)5KsI+m1wn|Eugl?0Y zMfhPiizd|{NY1D1^gqntXn0y{o|h*IuTtBwU?!oIYl9fewNtj9AIn9rR_$BF5KV6* zuV`go9&wyT44cl94#GXVMiy*0AI#Y`x~l&H*taNrP1^{UtTX*e6H42J0ixscp^sn6wfjUIDRhrn|!WL--+R8Q(E_b z?bEs2!-H2VO@BdBo(s(MOlKe;VdVdbhD3~taL#}rvAl(S#y9s`$60upOYd)()*ry8 z&9s@Yj_xk9R{rb$+<^~r=IXNAKAkIuexR_!T5|Mp91)M2rhoe?G8!UMSRml9#74V$ zA1u!yiT=Qr@vVja1|%Ah)9>*GLsf~8I7)(S9te4I2QBjrA0KviS*qk5%tP+A|>FAll)uB z{kb-W;9=tMy}SZs0seGuKxC;%Yx3}!t$5fbzd#O9KPg&Zt=LReh->dvl@O!`=#FtkT$GeuK}@81&cq%gAX?gc~4~dFSzhS$1?g{oMOdIC`}A zxaMJ(;oO-td=X}sbpEEh#_`j49!2)sCf5DN=eTG2C-Hq!HeUi$6im9U)fUYJeID$! ztx|s`?zNJ>&_|$+L=Dfi-u|{6(`gFwmJ*}I%HQO8>;f!?-T4P_`#z=+vnBAWtffw9 z9%29Vw#*7F=It~sdK#gqFf`y<+iEnq0!@h)sU5fL(sH{BlWj3uRhLVSmVS9^-Sq2k zya3x}8-uQ_xYVe+B$#pQ=nJgp=7YQkz>PNw{q5v~4y|rz-#h=pZpo@1V%FQHk-R!)%ENCenIa8XW zy4`L4&Hr|KukKjZ*X`m@yZ6K4%m)YV_nG-PHNz0x5bURSdiC9b+spih3>Zs(iB);@ z)Y~~jid*_F`kxk)79OdDEy^MGMDre--*Z_SV3Ef>)IXR{914f>I&ywHYMCy}cV>R# zT;Faq={BA+ZGxSY}2#i;BvEPk6BmCnj7!2LFh8a;+h%*g5otO1Ye zu(M<#)%v1F_u;S4IQ}a0XrexUhhA_0pkaf!*|9WexWFn!_srJCRqCUeg9B6PAQxGG zo|OWg`;kouzDdp=hwpu0!^MNUJllO$?`MnhTVqblSmv3xm|PZF*4__Tt!7hHvx@tF z6&yBCUeDYpSd?F76(|UV+Fy_CJ+1-Gc)7y%pI6woE@>xk>GLSiuGHWD3fm~WpSrf1&oU4BluWC7$O}Y7uh&xhKoh$J6 zGD?GBOdub+!K#$Ec%YtnPib} zmr^o^iJznjG%%ygh8$|ZB)zk3nE2>fytzWDw?6d5?VfLVz^6=78g4PxeP(#1zFP?< z;ztX1ZS%d+wobncem?lRi<4kvI9?1tnA^v#@g?(BXQxHpsZI~8i1lv!6?>s}1RAPc z)%`nl{EfPN6FKQZZkl=;qvBzpEC&6-bBSO`bZtwrYutI^9N%9o-x>|+6Mo08_cXWr zDJXv>X>W|e-DJA#JW+x((A2cXNQmt@?S@RI;s@EqQ(H88@@)TT7#jII)#`v}2U{_{ zMSCo;hq;uH0FHB9%I{2XR`oN@4%|svHV->kDf%faQTx32z*#saQ+^!(;}0NW>?2MX z@>LnSBw^T7)fK5Ooo9TweO72gzjClVRateVq#LJVt4g>f#_f9EFeBQCWGo}{?tQNH zoMPU3pK{V@pZ{^q^1=;T6w%qa?&)4Dg)rT~n)V8_KeHlkNqfp>H`q}4Bx351?+a$#{JFj&x|M}l;I7YMGx=KrHJ2U2cC#TzY=<~Lx{qa+4vxVcw`1FZX#z3n&%@D zd28G@4X<%r)Zq(*uWy&_uVeER79ZkQho#*qU39irHNjb_F2E8)dWa^l6YO2*V9sJ6 zZ^B|S)$R&flz!oZ!cLvDo*YgW_WJ|yCw9Iaq)9F{WvOl6Y>iF17O@V^yRduTpLzaM zQ1oL*Ipzt&yA#=sJ*#BO>P7bb@av5(%Q8`5E1kUM9Vb4doKXf!i_cZmavpPPMr`Q-lG`-X#w1E#B%<$K`tQ@I+v z+Le2L_+TG=^LFee9zcC6x1lWONx|bW8M{{!E$yYbUV1k$>t1^!CrGmYif;p$XhX6$pe)R- z(z$ClRri@*+nD!Xbh0};@>xl-PdtB@T!WXg2eU{w`g#Y1o`>YGcBhRa+#bbNRBc6P zA67r}O?A$G?_BbilbVivrB^dar3w;(4Z$wOW;XT*pvx!jaGij8z%q`{I6z!miETBO z%9pbPEoxCPok`WDHMsC*GT~;<*ZKa0%O!Xfr|t!e0^!{R8ABdP+qvq1JpiS~$Q(=4u6&SeZRBmh2(CA4RP|FO~`q;*{(kfRTOWyjrD4)|a$p!sA6>`7r){yz7+Gzo664#r7H>EM9QxE%M2Z z{5Td5$#;F>{I#m~YnDj4LVVBHY>`P=V+nWuvPjd@>C1~dm{uv{uA9)DzJUNtBF+ zUd)ezb$o?+=y5D6X_b^xqmsP8KVbY=TL1f?M~~8z)>JE*t{?sAls#wSl45X&`;^d>LTlGobrsS^k zn6YAdC0_rCpda$hOX!%!W~smA$ab(kENMO-J1IgZe40A+}B@c2yG9) zzdAwr_TKLH6&wB(SRrO4I*5%B{6E*^((h|~(>mi`{_e$v9&ItnUzSD`55&70H!y&S=hwMB0}i%kzy`De{VTKk z1f0;Q6R*IhB|e>h@|R|R;6r7u4ift;=hL zgx744Fc#wORg)VT82l6e?WAnatevp@H|V8=cvG$Lc`^!=6@B!YS>R&(E=yix0|oYo z&^z&YT`_(wG1OhSYLoXsUp!F08KEPlbYWB+73jZ7eF_}YxAEEOyHfX3_-z7SPdNW$ z_Q~Anf11b_)9$Unh?m5Pm|N7`v8Di3)l|Hd3AcHeFT`pZ*}&`TX`;v8CJl3Coxk2-!Lq!iyM z#|r0vO(nK3Z`JLh>p-%ve^DQ1R4-s*udY(@0p)MGV;v?GA4$k-bLUULjNmSddZ9K$ z^g=~Sn`ziRSW3tHUdC0m)Kd9u6M$~Zt%M% zqFK%yS`hyOK%+C&%T6R(B0u@Od8t0jkk5vLPHd+bGbOA+EeU-Y82PZPT-QpU47lAT zwX-!hAH-tFU$oSk^Tsjv_Vew?tUHOj&Pfd+hgBHs_yMa#Ma=h^^5Ok%Ol>e$lQN7i zQ-7W=TLNLpsT+M857Kk-@e6i)m7yg5rOHANyg<4tMSJu~Fe9_9F*%r&qeCiDQg^hq zAQ?)ADt_y+i+m|F@eJ4yZ-@7AbFqYby8EcLsEdM&GY7MYOOIS%uzbSZhwJEHT>61r z{G-tzl@q47^ud>JGsGnKoOp#A`hnw12)n-8@-qQTYSWNF#@ z(W25DscEY4?ia1(w2zHisOTNTc{QEbenM3(5LEObr9$!CMVOqX<19}8-ai^4^a z?y83aySt3~t3j>VJx*$3lQq1(hiRS7&xDwfD5%f3+%;)?6Lr3JSH2CZM2nkF&LWbi zH%zKU;w@C5D@qaVoOrSSp@y;3j&+5Q`Yl?}UDlnetaOHKi6PRq3Qh%W(JF9_S6SJK zA@w%v)a;vfuf_Y<$!g!8QG%*qy}RC}?XT_*7OUG zOu*BQ_i^5{vNBu79$EuEP-BGjdr9qN$PS%@tIcD-cNKH4eeutAHTm=~K^O0ISJ>5|)k% z6(>ZxnHB6XQ6=*1HSKj~@PgAnKIi(2B+m&-c3aK;tAB(I>Ac--ATe3)xF+U=?3#~Q z%v@b@eRc8mQugrICP~?*s-?iD%$jSi?cL-n{}{WFVtn-jE|ty#oc-csXUlOR?x$+7 zs;ZQ0BXy0Sr_zX|d z6RNi32mU}@L7Uc*Jt@Yo6^eB4K$FYfLYgLCv>&2GD`X7}NoUD6kyjINO-4`&GM^!> zjYVFaGZ4jn;cM*YWQehCP!`jT@5^NjNb)kiUj=5>C({qtvi@YpT%^6_LU3xCWLTw6 z=F~}&M*)%ZU@Ev zWx+wP>1o%sUV~nV7vM(B&@HLg>1p_2c_SKD5RjOYEDi0oc?bKm2HVAg4BB#y^IHd!xU_(O%;yM0BOck;x$#R*(E|*md3WU6%7yGT~ zNL}BRdR;D3jUas)(@&@otafUA@y-aH8Hz4?xa*vi1~QOsk3$bCps!Cn-wLSo@G0PC z*u&2`&w3Fm<_}Y2Xlv5fXrLfEcgbjb$q{`oJXS-LrT?!ah^J%bj9s1@mki;Sxwi&V%4-%-7hSvM}qUOPV?%m312meiF$qwK6M zgi86qI}S6eT4TLr-n9;P&NplX1>|UtE-H2Cl3LM=b7cC~;daMoi477=b$x0Qp|MBrW9hY(#a;B^0E*(00c#ca^Y9O2RGH^D{aYvTZEx}v zcu2RK2n4r_MaUpvoDoXzdkBv3q*lWL?5;QDpWd3>5CjSMuGybyd*q+wD87J^HYV~) zy|96*A-*?ZRBg`UDyz);@Pb)_NKT$4=DEc4ngH%IK0_G$wzmicC!+zwDcSl0K7To8 zTM(aF7ychs{+oYD{O2cTW&BG(cb-#mpLiPlO4!#by_5LbCu%W!UvZ0Vc6mA^mn7(+ z1U}(ArExlh3Yyn>)qKObGB z>qF?=)PQaJ$3PNU1sCk$w7c(aam$Gp zKgymjAS4CQN>SHwhgCbz((Cor*N~a7snf3K7xjr~FB&yoyjg{^Zwz9@u=N}VjHs+msYFxa;Q8+n0W0)+2#R)#ZWGYT6!1%y>!8U&# zw471e4ag_Vb>@b|15l`)4~6?F)GfYG45ij$hmetWPkwNg!Yh4Ojs7JVR&iVg#s!1= zlijh9sX%!OGy&wDUV-xv{D=xHHO2`N5Gf#cz2WCICEq#)_ngQw6sLq2$EYLLYB$Ec z#ii)E(&Yrf2g8N0SbCqoP zW)c9t4?veK+kiX1^b5$KD)+#tJ!iKmu~a4nmm@6O~KM<`yB=GX+ZUkWgH}L?Pr$_lb52eO=j48EwO#;oHIBKg3{{o3AR^9R|3149ubNoaBLYL84PP` ziK1qLblfe#qgX{n;wLnSO0qmD)D4%&1ES;5bz&1w33uFa?q(|BBgXuhAOpzc(SUB# zKt8aW2uja376qa%a?nSn{aA!+Pzxl*qQ6j51rofIm$|Sg<0g($?F?;3SsY}0)ZzLEnFyu zG}>vuE2`w9 znHnc>k<9VGC=Wj41jx>mSG1^zsuT8Za@!8P`SB=oJZhk z?g^5WcghcG3jlwrXDUw6Qmi4TK#Hv1!-9g`@idxUkQ2^BL-2M%1@5~VwS5TapGxR99O5!=`46o54hT7KbmCXlm% zNwCOP(mYA!y$d#Dm=y;e7ZU4-GhX*%vwK}%!t7B*RBrzfYiav_0tvzV86P2o0#RBd z_0Lf}{D-x1>shY+C=lZ|S&>pmbemgGDQ$x~`k zL%RrvH5HpcGL*a=@KfppzklwgT!J?Om(&lH6Hx3g+7SLwxIp`NK}zsh*}2tP(DR6o zQ<^+d!J(PS?2{5xeL&vVGqg^FWWjrdT}HY|8;k^&9>)1~9^Ub6oxre#Uxy?qUZZyn&eEE@Egl4SlnOQeO@8fH>|!#J2_2J`{SclU`eEd3D^d@_^hO|!n(AMJ$D@VW3t6T zf?@SkQA8`IjzJ=U9|ZuJznGu`USJ(HmAS&AWIY;18}Oj&sDhS?x9251oJWK0!>HsI zZ{la%0_o0WoLPzTO{jk!A0N*3mNb}6qyWo|Q@m_Z(l`HJa6}^$Cj&F zulQbYpp3vwcq>i;_mQs)vl683(e30GPLQO7P^65QyIU$Kl3@1O%s{6{!Eh`^9gZc5 zNvP2>5YWY751-Q@@d8FSv;r@4!Jgh>uUH{DZ;)E;N5uv-3&xN4AbZL^)Xa--*o>n( z?MF@UR!D?uep7mV%XM#)Uqz)2Yb|G&@Ifhe`{<%^0Y0dAy^yk(W?WLx@5P{FODdEf zYTRe++5YG8_h#}kW;0=psnD~uJP67JjFN37it_m{I=J2?y-ANTa{7cg{7N#${kbYo zIb6X*FhXV8wuJnIuk=hZ5Np5u1owr%n3k`9OlvI@o{@6{-|p8_*2=Td9$T-aFjA$Sif3#x1ckKh{7@h5we0#$~y2zFY=VnAwki))MilcYp2 z-&r)lNh0xzi!_c(X@Qn&3NQ`>8*nWMfV80{(TvG?Cx!Ek0}^RSyXLx1OOzNw9hUCl zMOMsxV8#)aWDegE1RRh{49Kc67)CHXG|aG>peyAn!}tCLJ&GwP&{r8YU_+nbm@c>H zkC8b=Vq*4w0{YLBG;O6*3+`JK7Q*GxweJkdH9E-ZKG^jthE^sk^>EpeiTzxiaZU39ff#nt8vj{ z?UyZUP8N-Oo7-pqQuA*td3qF~9#5!!;ya)t<>PYhRU0X@QxF_`;RGKx&!^Y9^u-#X z5b}L$;1E8gO(nmPE=>H6Nq?X)6C?XcMzEUq_5#XMl)J1&B7k34f2Q1uxjoK^xZIIN z+rNdJ^UiJH&W#&am?-FhZe8yO`m%?7A9ENhz2XQBsag~BegW)nIqRK@3>6k~7;)gv z;q1ofGDk6Fbg)?hi2fCS4=w4W%WX&*aU5|FvbQ>ggZR69xfcqP^;N)90o>h*`V)r9_|PyHPtSMmfKz++~uF*!x^xraSc(7QLMs<_3%@mm~GV% zM@}FfC=glq9129su(fNJTjnm z&Sb|t_fjPta;DjB@0XOl%3}veKQX40u^lA^Rp$mCeZj`&_((C%au>LnsQIg;AH4+} z&}f?`J9m`ktfZdhc)%0FysHB^C81$5Y$E@4j8ZF~r8@i7I$hAW_o1~e$8#efbdcJd z{h>=|OIWA%!`YcEn&n~9avX$*j-cA)K_>|$ZyzlAup@llsjfsh)|+-{1=Y)^BeqC= zK)me4MkDMmceZrbhF= zVV?^|D2CB`q1HHaj*gDN0n$OxQFII^z|vHpaHlZK{t^vwj-xoPTH5`w)Qk(3=D`SU zLIm!Jt%aa9aQp%xN4G&!FVM}88c2Pp12YExVp4Fia^OP@9XK{dkpi4x63NzzPTM0vq&;_S-sg811dpeTw7n z19_AR1n;;b-gi>S(4lkp-(|ZyNtAoorghToE=Xq)>Y7GZP#?(~RK?J4J4r5wrh4rr zg2g@?mU14Xyk_=ERKdqx+a}g|k*!v0*9JPn?GaCfKBK0$W@#C*xQtlZv?qK30>6%u zGP@+k>4^RqcTzmD!Wo7oIm?1yRZBm7S$VATn?s6Z^34>?;bwgfaBH{>FWtldGO5{k3%FfgfltG+g zk2Z+&YoZ{mHaP+4S}dGb2;KA#8?K9=It&*Q)x7A$q3aIJG)m!#1b6W*6NZ_}3(;F- zUIkZD1~z{+7U53?+@_O*EpOlhlDCQ)wb>!uw?S6}xpg?QVA-y`<|rELLJ-E>sDbBn zQq1U_1fIO$m~gDMVk#v8QY{m%XcLRJW_~;moI}SV9I_@jK`>SfIWmilTUZs7GZ*LzX z_%Go+N&eu_w5;4CcK;0c>7VnbwBy9piZX8j2UVVG@7PFCO`!n9IU5_jqZms<5D08% z&~K0B1)T&A&{DGuBt!{5m;@r*BSOIoF@h2^1Mb9on=r*t8TN|#+GRF&d}_eDA`U~* zt{7r5kTYz=8ghvlSYrR=9FlNftwl#H!8WO(z5ciIgjK zO-v%K5AJ)r;4gboK30C5H@C##Fk8z*)C?5LJ4R6*p^g@_CE(5axa@9x!+-dzgr&qh zbS^>I=X^FEDhQsoU^}!G(0i+TRL%merBV#eev)qBy&F*H8vc)SfENr_r$$}U;A9wx z_xc(Z#R;bFuS#R>CM&-Ofy+2n8Jm8npvJChx3?HL!3M;e(T87jBQr=^65{9j*-i|{ z@8~*LdyGRpBT4WEXU%x8j#9B!AgcUq|BPyuWvm^Qh-+x1b;(d-*vT6n-H5d_(s^F= z%v6NyBf(NRe9#cEo-nQ9%VmERBm~E+gkB&TUQlQ;?gBYR>67su&C^=vhL)YbO`6Q} z)HCKJaG^S@g_aV~4d7HVmt!L*7qW&~H&LO_Loq~>qEjfkl}V^MNej7tHjL6Dgo5;P zL)dXK96}$$ko|x#%DZHuN^TfYqXO1(Bx04+5sFmBbWZ*4wEC<5V60%j;DCy{ z=-P$9W|7w#rUJ1?68LQh_81~rk?ecBC=UiDXz<{U7?E&iQ{Z;?D3aZC(A~!bO9wJ1 zj$?}az#&d9Y)fk#*SQ#)-$YIw8!US?5M^|9y+c`$Q!4M~G2B=}2TNZ$3lh?+-`r(q zSlKS_aKgjs(V6lOvZChe`|~Ut&glj>r!1<96lv{9n?-A!UElw~&1V-3z?9W-I*;$0 z8hJ~%J|`X8y&rbpGgrH^09^;{;#8#JMx#uPT!fC|AO`7qS=Uwj*BHmNP5#y}OA@-# zPkGPMOpUB?y|{BqHuw*EERoxuMfL79tZ*mEvfcMyv^ zy$WYg$*8g;i#zPT5uNq@xp^K5iu*IowAxuzQZ#MWy0FlbWO2k@lmoG+>f8>eC=D%$ z8^?c0lgrONbCa{Gmq)Uu8t9}aZPr1IgB!q`5ZV7Q+VOMBd&kejxJ)SM{8+Ba;3lWk z+|`36Zr#7Q)9>b3J8R}DRicUy#%}JJ9X~U4-KAb9W1e$5PH>tVuP@4*JRJ4j2*J5$Zd3Cijueb= zW(soP@#ZKy5KsY$bO}`fX(0p+?>>8<>pGv#IUn}>U%6&ha;;f2cbj{D_dS!#vCH3p8+uy0S^x?P z3V+&0b`6@*+Wh4~^ zAApjXf{K~qvJC(R04S)*)c#BG|8-GNQe7cadG#6{J-I>64FDwt6%{3!eli2(*5Tym zfGf<@H+d!0Xl|L<)AIQNC8JW_UFBD={tiM6ZVN~`_&>Ww$8wvMjs4DDK_LiK8YUwv zC$FG!UsFq4M_11jX@)Ylu(Wb?a&~cbbN2{%92gWF5*qgWMRZK;%Q#Hx>ojb7MrKxa zL19sG39b}h_Tl5Fn%cVhhR-dnZS5VMUEMuH!^Dx%Ut{AFbMp&}OUo;NR@ZiR_x2AC zkB(1H|K*DUK=nV_`rn-WKloxM^F>Kk%N5#x`J$i{r}?Ze>3)f^EClrprRlvkBS)p z2b`!58M{?J=PAGl0sa$9aZy1el_m`aAXM<5Tdo7y|1+iczceas?3Pc75&91+ki+dh zKOxKv+uh`S9b)x)G(Zy5a4(}wlSB7z*3*|?KEfI!;hbg?x{C2+?K}L3nL*9D#N4!o z?dRPJpa2vds+fd@x1Ax<(#*z&yvEtmxBCJV)O_gsgx^5<7GLjIu4o@S<83-pJ!Gpb zDJ31v_Bg{sJNGJ&T1XtjPvKr4h9rl@FBZ3Yn~$07t*r_Dgm|wBTBP{;24`Z<_DXB| zm@IujSSu;4JNi5WH0mD2qVQB*m_tX@bVz_c?|p?%lLxX=o|s0u`&f(Fny=*}I)oJX z?RaHwB)52Zjh)9@e~QHo&}Is@KNmRjdpL%p(gWQwoZ(LcVzYM7U+#1bcEu+a5ri2) z{H1&^Qaq-?E!4OG+VwY6YJS)c+&wPuR6(hJ*M;?P=Ad z2A|rfZV%T>m8Sk0h_2?tguBzpv-EDab9so=HC2$CzxyOOc}Tbc^Ln>a=gJIw(Ay$4 zzIeyPl?Igq!PtF$<=cjdKYxms6~3NM@;3@FclvGq`k%(q{jtqr{glvT#US7vSpxEv z&2rl-gs6mvW|72vdbR=rlY$Aoa^vdeRUGe0=V&2La29L@IC)Bz(bt!||NWCxSi5z? zCc8GjilJP8Pp|dEX}ICtA#+E)&5o_sO8{NvM_)0qT@gp`Tcjtt`;oid!5w@MDhc`e_v7U zmIJ&VW89}ujxKILmwvrke48XXC?AL*8YhCXY0&8WV-1 zKH?bycK6J{=>*CBQkgx~F(DiVfTK_a;4rF?u_6hGyPrNrRThXp>Kx4g63BI=%0se) ze_x;!`M>=Af5*MDe~$E`qRzT0$zK><(4jr+vz2E*QLV&Z@U^b&s*b%ExKA<3Xfr9` zpLS>5=G8`Ztw^X4CqRL2v2Aq8rgSDj@$5&1tM?Csq&+Fl*K3~t{G4^~26@bk++d(U z4c!4P%X8uBDSsnNBE^MDg%Ud48$E1HY9sk3AJ7}M3jqPspC}Ljh}Hza&gx+ePv^Vh z`A9y#Xt3Pr@J}I=y`&1>JP~#wY4bsDRTE7h;QxG4VO`92in$}oUu8zsAWcy`H%(>y z>)z8w{Y>|u>x{MIX7>>u&G*z4G1R8&ys*(i***T9u{ z1b_QrbJ#F_k!}wrPDzvltV5Mog@VQFzF$&7$e-7d6ltzym;W`+fF|a2^5H;u8<9eee8hb#$^w#nNfj z?$+VDk#OQWJcY#f;&`t0B&!!N{aa7h5AvDP4T0>!f0B6qJ3v|b=!_>JbE9J5%Lj3! z$<(jH5KqV&Ea;{ZVFsXDPFBe(q<^8v|SXS z$DR?Wb)7BWDXUQW$6&T9TsnUkq6tu9_l2?I=l~%w0oN6<)eH78@SAXVhLgzu^5#1& z|EHI{id7adyoa%+c4y|S1ZnL+aJLLQajsm&JkejK(=3$-6}bdF4qrIgIYtG#cC+-p z2rYIjP8J$xaD3!OS;`f;YQAwBV8*Jo+~+An2#uI&IkJE4#5P|m(8d4066%7 z%R|+-82Bs=!8)f0p%$gOEp6%^pvqWWGDxm~gL*;~^J%7LC;E;6&f{_ePH1=)YCyP^!2aMt+gk4{jiRwD%EFN<-Zae z5=Z>uvr0^Bp7lOi>#-ok-i+!Ibp@N$ad{Bl`-_>d+484%|4{o$72nc=wh;X)45-!A zF(#@whvaXj(L6XhRi5<+8=BXLfedQ;y80LZwJ2qJBnA1aD*c0!VLYJVO*2^<|5dwP zdD`WcKUDB>#o?o4zQd3O?tTfay!X zLi3!?S3uR&WDR{m!-*>0)zj0V(>|4jLxj>HW*-v4Jzm9)D)x>2x`-mK1yw)^j&vjgHOam8b(_cDEJ;k2SQkm(@zDfoE|; z8IFkspY`8UuiuF87~Q)Bd_FT;w>S#>r_cjEB!W|0|H!`w^24(|>h|+|Y+4XMn6i%2 zF)`XLz69hV(6cl}n4Vp;X|A`um44W`mn3B66` zESb_LQ>vy3G^Y5kqQYAIwzd_RT2}yZJT)8pr0jxZ;>L#bJUP*N?d~m|BlU+c>~{J| zZtrpLr+%Yp_V=O{L<1IU%Yj@~x2|`(D(_r0H1BFxuyKEC69rxZptdJVf*0HF3A=B^ zq2WyA^+-2m4dV7cL-5!9M3ee|RWD?0v0-d+O7R-eR51koX#L<_3^KEye-Z=0U>ZG( zJnA%LCcG94*?L;W+TGQD&)zf~HgxNd$`UXm)!g&5{*Y$<$Ij#-+qQNbe5D6|cHX>T zqW}96z}%U1oSxBtBw(5}ikoQt%%~eA?pBepUH8&VpX;taZOOHZ>!vxnBfNGWR_ol1 z9O=yQ&VYC`%SH5!`MMBGGNTyz@ab;tBVY z%R}Ar9WzA7QYN{vFlYze29{M`k$r+D{j*jAsM=W2{%gS6O5NP>HX(&q)ZE)qv7ums z>xbNXD8g&{ZMU_$wM7*zDDXD0T06=VitOnhe5dfk|ZU_LDsn{PBym`J%M%#0R z1CQ(T9*22lzd`r&c>I;=y%`;M6Gp|VNtM)6qO1k@1IG%@UQGP)_X)`DvWp#2JI(gA zoaicc`dI55%A3so#+&q~m{EIssJ>^tWc4}8J{|pno&=K8@J26*Q zWD>-}FLT(ux5ad^4QX{_wGleZCj=M$4(tQKw*p<@2|@|z#*<;H3b8k|xD{2V-Qb`L zh)O%zVt?t>iH?b_An4=#MzjYIL>jaU{^0x%sh=`!synxc1jPGZj5I@G+|R;aCcZF@ z__^@T^cdNJ^2V%e7ark=OkpreX7A}9k{RFR3Lzpb{s%k(&FCSM_3JB|4v_in`Eh`W zF8lj!OhRQ24vdAB1aZ;M8EA&)M}Ka;eX$K?`p`NdbP1pa*?)IDvfX=U(&&xzyKd%p z{s^)Ve7-Ne@c~_nrlagaFXfxH&Bxs+X_7+PQfRr4VW@{3`Z?S#Io^K5M;fQ7ymSbIhvG28)2=#N@Wm%t zoA6j4`JP6q^R?!4UMrs0L6haKice=$-by`W<~)!Fdv$J?nYm8o>Ksb^Y9WD<^cUH& zT;pS}Pe)!E(%-KQ-*HDZHa*lwD~&AhC4IrItETcFIf36Y25fQ?s-+)P-y6%1qb-O> zNXMh20}e`?f7=ah^dF%Wp2hmSh6n6QUtMsnqEC zTT95{29`6vf2OzuWP~zZ)cWiYP%~@;qA|DiF{V>p`j-HOUp&E7dnMI?i`lLbh1cP_ zi%AZj!n|LzUwJ6gBd$PogH%wIWH9{ZyjI5cXbIi&#!~sZtiS7$0NCC%c#6RHH^{A= z%?x;2MqygG^GjLz;>cKXKWsRZno&FCRmV+l+hk$2plu51$4JoZ`q%Fe&!S@qHN4rzfC zC@p_&{+!3g23Yq_w#%Dm_gE96*HyNTq7^q@%btHS*#{{VF3Vhbyj_!={bF?_C0hTY zWYJEm;dE%paasD%6zeG(NLE>W-rEP+QJp^sc`k+6q|C4Uz(?Q9yK7j$EzL(GDx%f` zRNif2o4^K(0CsA388a>7&$-&!rLFYk+(4b6rFR)B-`M3XPEwri-0O*%HT{^jA>yc# zC}D2u^eW9xyGGw2Skvp17vZjgPljsGlG~)|$>SU$N*>5JWE4alL8)Y#{B&X6X#Bzb zlV9tqoM9TiS1;zdX-!Z!<#&Fhh?=KNex&&J2g;Ia;Ky6}oJzaL)|a(pB}rS{v$$9}-@ky+cPYrO8X%8+e!g9T$hQMvMLB20oTMGl`RX!A zIa+HJLj)v19k;|*Or*R2dYIrKYh(D^M$r-bc@^w5#m)^}88E0JKQ}*2uC|7D>()LS zK2`4arZ(?|P`w4_PI7$hjVIYps!Vp567=k+2PF<*45j8DhS=!!RYInZnbk9VzEpa! zxnwCoF9EYK+DV-0Gu2Z%0^M?^Mp7fjvy`-nW-sO%mYwlOv!}@^uUgPbQC|Ym-H+c8 zeaPUH1iZ)}Hek!YA7MwDAFu%bw(Tj}WvUQMYaPmDCQxjg47cX?on~vH_Dd3(^Z>8@ zz%6-LA(wrlo@|e#&&ZOS*}Eeh!GbHs-Ck4-&mbkjtbZOxtdnRet-EvCD2@uOVQWd4mm)j4KOirg zY9&=RwC|3b?hc5vl zopU-@LO0=bFSHdN<8Nw%!;}W74m-lc&++PZ+sL7~TbylZC{x;Oiza{;K4p45%s4x* z4p|1l{l-k$IiikiWQoQUA6Pau`K>PjfqMo4lHteA&?|+?K^K~UyW@p_hy~^*ds+#{ zroFWa&rKA?N$h~P0&$U3m9b;QJP24M;dlg@4WH*Qw2Uj@-=b2b83)WookPAl6_)l7 zm6s+>k`t(5HTe{7x(fWHx|Jx9+v{uFUucvAJgI$PP6F2kq9Wrc1%*C)4v+IMpv z0(Ur`jNsgek!1>Wu0KW`s%g__@+#ybZ1uA2`%#o{mpX7;F4%Sl@s*l;hnwG!IfY!b zt0sDljZAF=lJ~nwVm)uMT-FC=qE{-0Q~vtt0~wj7?T?46Y#JLN<~}v%yIq@?fJh)s ziptWLgiW1dyM{nNMCi-ssnBP7mw-+xrZ!_|o4s3k9j~Z+NkMbF!)$D4QI=bQpU$gv zXosGcN+zYV!2c0iqEEGH>)k>M8U%tK+4{_-VYE~4a>l@;rTG;V!@t%jiETYd;q%7x zaJQs5nAvoS#2wg-T&>~oGn(?q+&fc%kN7>%UH&r&Ic3jbT&i)wo9LVIOI-pO9QSad zlkaB`LRB_Ri>?*YlkdZ##Dba95LsOPrvq@P$nCo~I&+D?tKS!!J3T^|3+|N0c}G=6 z6q(pH1jnpmQWb;I^XCMydmPJ>Oui?030|+w0EA((#;*K=Fp7Ea@0scd)rTa!*%dUkA9w0jyjumY5@WK)ho)1mAT zsWY?SP&72U!X&nQk69U&?&9y5b5%2xJTTxGoz2I>q z(c~w*3B{iVo-Z`PI)Ci6?>44fcNIAdxlkHj@8_Ruy_IAocT?p{D-IxmLM?2U(hsW!!=Y{P`l&}5E3~8tAmI1AygbL zHWp?pD2+}%PX_H89?b}c|A8nSC!K%f%SQz;K6P%Qw8E)OXi)ESpEtY`fPOp8}ClFfuTH+ z$5&NK3hmjHgdcOQmMC2eP_xh{2E95iGTE1ImpPe>D`xq?9dK$&>i2C9)Sefrs+33E zI+s7C^R;NaKZ{kp1bBjX2bl5;ZfC%yBS}Cq3K)BvMuKq&uPk-0VBY$-rsK*Tx$~j{ zh(MqD@24)=RF2%%NiCJI2FJD+riKKHAMx%{x~+`Q^zOSiisWSyjC{cUWZc^-;93&# zsf{P}NgSNhq@iCmV4rX;m_-~Jfh-B>uK=LjO6+?`*el7sf6P~{_*RjAENdqI6{9>V zC6N+)&^Onl{5Xxe#KIb=&3-F~g_Vfq9MI8g1dEPKj!ws#o|nD4Uoo<9I*e6kN_RdNVhfpU9iQDRGf(%+MW`|r(iv|IFQbdaGWZ$D zUZse}akA7WTReQEY~$m%NE%COkvJYWtSql1ng`umO*Z3uodJ&u^Z93`kLo|A_#OI3 zJS&ZJ`- z-ewho0ckM(7O6a()u9xhPIL02nk0Z};2iv!V>n1Vkc@sS%(zrq6EeHi(r{{)_T{7B z9uG}vyFF*@Qm)j2(Ken#D~Dv+%Z+A7srd(cS~B$}{VaT9k+Yd{LUh$8(!#}voWs;# zit+q{NHjY^#JmB%K0T^4GaM&5%kRC<}$aBC@M zf8h3xMm(#Wwgu|}qL?!(bjk_D;q$EUU^!X!Dt5wf&r85na8%K> zPtsDU8~veMPJ<9H9k6Rl%3a-CtmKC`Rdr^ zypK9u05sZNtUm2%+mr9bIQ8blaknswIuTjk^ak9LiSqtS9VnVVnM*M6VVYc6a3YQYMY;kV<{0=lgd*gCAgRHva&Vs~N%>m7v+KiYAo7U-7ypH@E;4Gj3}ec{ z{A)j7%jM)(LDVtAr{4PmKm{A5>AZ0|68tF0$_}QnkY&h}xEE2wp<*-*%oFp4LjhqM zf){quyUDqgaJupy+$JFcIZy=t>^`PhkiMp}4pS4%$mNq>>OZPBvO$NvqObwk&b9L! zG*8iP6XJnMUmykd!tf=0pABhuctL_$KI55Yk=5^K%+B%Uyxwn&uc#Yb^mT6IlB9nsOv3Mb#$1N|BMb|EweH&X>HspS;JYPeI-xiU~Rsp5kXE zkqvR|Sh%#tcDqgxc#i&fw7^|IFU#ZGpq>4Z--DKhn46L+dlA6Sq_g5?_Nj1A+_VFf zb~qEwR`5N5?Mpj6&=A@;p5m!xt=`;jLa*BShU^r3W*hB0Mx-(3iWU%%QaVGkw3qS8 zlLrDuZKm`uPoE+ZdU>oWMB`H~y5r7;5i@c+bL8|u9jAx#)gr0Pr6|lFxgqzha9{A0^k?2T={z zFkK65OCf-593my+d95XSKb<~D>sX%o+T>yBRl9Evwu-97w?0p@0*qIUpbVUU z?N!Jv*S+4-kvga}@v_gmu=y=pi1Dla{PMBjv^D%^hLFu)1S_i(=Ws%C`E$m?-Ab)l zK;K=1Ey=oyYMsR7jsPx4=wId%zj`F z7cw!tDNX{y6V%uarZn}>@*ae*THJ$#T9*v!v7pX=2bJ3@>A5t8y^s7^jl#otlzVjZ3-HfuhX$@&PqIX5o0uviTU2 zsU8lE+c0tlW4%G9tA@MC+_WLkkGmiIp`X(Isg68LZ&dJGo{LRn6hG%XUZ`n6y@?>FHc8A{$p`#y2o8+w!CSU|-8 z%C5VCP&B>`?T{g_vk$IyPUG3M?REQ$S?H6+yYUWIT5Rw9nXCx6{D;)bq4JMFc!wa6 zcn(#zhUC5d8Ad5fA6IFw_QxL$O7MC;PmF2gpV=S{A6<;raK(gxI2x!nhpD9gW^G`u zzirt~W&bE}36P~Xl$8`ZYXCl56KJ@f%f*}y}0DUKxCiADHg-dkeBL7VJ z__ROs$?0fco2B3taD}UlRmTG>u{L8qEej{xhSL%GirexAczmji+8G{AgL{>p^y(Et z`zRxu#uPI@Kl0U~JzUdcd`&`!#)WngcC#sdVJRFpfFT4rG)(2NC;yBQuJ_yRdwzg} z4OM;jZE474b9|&gPHS2XwDWK{NtaW>=!LDz(^-9th1tU;Lv&^K%AcPlkzmB)2K!c* zR6_-A@V#qCK#I=L7@0{WL*}C;qXpCrez8a3p1OOFoQ&_+PW~dIY-%M4w|s=vXQ!3n zP`mpq_m_}W=WEDd{>|p!0cI{wastk}K%Ga)zlZso6LPkIKH9)?#SF%4OGX!aMjGHV zja8G*$4oP9N2aFbqq~9pD(49LL`x@)UBmh?m=3qDf>59AQOMahj2h7EM*tvPO0~0j z0&wzkEkZ~-+-bvu@%glzCDobMD~Kmc8vwd4(7Jhlx>aS{fh8W^|(4e2WQ zW;v$lC0#bjgtG1A%eRiSPf?UJ-ARpl-f0(G5=K?zv_ZYsJK80=Q+EH7+4(-Z@Mc%toE>1HMc^Ne z2q1Zer%Qo%7?6$0k1K6F$*4ssXB${(bI8A4+|wCQqG;sd=|$P_y+S8q(`ZgF&@wZ; zRa=-oCrMHa0c8`LHyL1Wc{1ObCNTW8yXdTpB~Pf*qc@ZueeJxgI{W4VoskOG%pvP@ zjUnhuPHc}6c{V+^ z!wO-8@k41@pR+MKP42v})goBu-?z1>jaFqVabl{y6nWRlkfCxX9(kR8U-}P@;Y+rz z{HiLmwEh@^b?;nyUuo}wJ0(U#Xv!jeDWojs8b4gTtHS3K!+e&oFk@Pq%SEo>S|N;K z)Lsiw(Zgm$S$J0~-#NrAYC_ZUjIXQV=XLe_`NYAKMT8^kBf5R^#?Yhnf#>FweR-L~ zBgl(2%4MY#*&VtUozH*q)!m7{TIR16xu+VxTgAL5MDs4i(f0EJZs}VH4}wF^!nfdA zJR6pY2M@cNH7{qMvR`o`eGHGIHh=vf3EcSfiLr2&mVT)A5ApB>E&Ft-ucN<{9J>e~ zE&eKXa7-aRQiL7v7*hCo1x~(ltlgYSxma4R+4!R7D#T&qIxqr?k^LvA#;jpz9-ZX~ zIK^lvXcFHg2f?U+7~3#q0ndJk9eU;j?56gvzA=00Js#pC!PHRj%_g_g=d?j?AC?u0 zW7OA73M9i#)6VOLQkWs`vT6k)-ABsGAvaW@CUu@iJMwaN+nf zjGam14h6@Dye&pJ8Bgt0^`}=VBbN!ij*p)&$A%o3<_(N!&=I!(xqAut>TYp8^6;;? zByL~;)F~l%ddpH^rbF^tN_e}9s2XuzQz-lw2E|sHp(PbpV5h9jhtvJ*#3|S3sumHi z@|ZyxITHEEGPD4Fhqk5-qH>wj$}^g=zci)6M*Q zPO9_-z)G@oeuYwebUplh3?rM!l*bBYZ_qKX{dmP7ld8Nfh%9(arp#|T9{CWGipPwLv zJnDpu(G=%pH@~6c*ld_t5AY}@q`Fm#Qy)NXM~CgBkquZcVlXicFyarfQZvz0#}val zhTAFdXnyG}`I{fE6W>OaPPjAS-&L39Fg-0SzW?h-7|Ph)h@4lu@^+Qsi??OtP-xbc z*;Nm-ggzE#pC4+(VeTbuy?E>D0~|eH*Z`HvNS~aI#Gj&(%ty#Tkh52z$&n@*JWwn* z*T`9KuIUmISb>A1gfyFWKaU1H_2;Oea#1uHJAMCGy0XRAN@DKlRB4{^Ej6vq_u{|^=|9!!x%gDx561*kj#uW=|3oW*M6+RL7JAN19z-_B1 z!l&iVxMic_c7D$hKpD>*79bhjtCUq9PyfU!p+Xc!Th;_OHuA9f z_w@OqIXkx%_!D4^nU{?7 zB>+WE>FjnY*@j735tf-gpWwFoZ;DxwosoHr)Si~kA>r`Xq5pY#P+r*6+TrYXVgf?GUrjByWa6je9|?`aCroA<8D2XZtqBZ!d7~e``zsNzO})^yHZsa|GKq-ktk1GAQ|-rzgd%q%MA+ zhn;d+A**mvny~o=ldi08>~~lsIM@MgC1=y1l2CaTHk$E5@XKQR^nBu7s^w_TFg!sQ zZ=JH&v6JU#QGrX@v)1YTdtLkU?ycC9*d`XLBK>t2@_c<(t}QLvqXSo1y8l7ef(*J5;Ca>qbW>*=d+fby5m6;hyDVo zerVl&^boC({DFCZUF6Dj4yHz4(5>=|BHA@*x5dSE-U$V#LHo3LbAbb+o($)ngLWHk zS0|i{$*2ehP{1(zmpxs^tM#$Qdyh9Ku3Igd^8B&B-}$ov)2U0kZ1w|asLupHX}cWq z<;TT2dGS^4yBC)I>7{~LjrPQwI{I~+38nEh58_>oso^ng^$e&YG0%f_zWN<%)1xO@ zkywk+Y`8N$nm=K&ErhZPNud^awoq7SdQ=vOkr*=z@O|DSe|H+0BKrEo^N$cS9dnb1 zlXD3lFU=EVoX@%`p;FP5Tkj@)(tR@=SB-6eOPVY>^nch|16%x7I-zMYS~g`<%E^9@ zMKJW&Xttn{Rd?>w-1<_bL#}HjEDF?F;hK=FaL>20ra?4Of$)Db-JzScM+J)K;3f+i z_soE7*UW{{YbGbq3mW?$n8?`rmVF*c#)HKz&W^twDV0 z@*Hpp>2EXch2EJZSk!*mje3GfhB5?@^ypg2E8DOS$z3B#zFzA(!9uV^ZL7EnJ#Hy$ zYE=+0Wf{+F(+$-Q3%l#lHo7r}3Uq^s zFqpj;F)=MR;Ep*LDh{NxdWvcu2OgH>z_?05Kcv8Y-(VspuJ{VA8k@(Z?2}yNfU|6r zoRSAItJf5zaM}$|3|c(SXDF-#&Ze;s%TNtvo}z&kbhf^Pcqx_rCk$FbW2kqYNPs_z;d)_!jUy$?P0bX`beBD*L1=Xb_-7f5+jhVLA(>t)iAX4hKNo3JnD~~%%{Y<<$ZgWa7*IW_{1a`atH>%n! zUvK*1DvUifcCI&xD`Zsmv);R}y5tXy@1a=0&^V{i@6xpXb=zG82i7r#)z0%pgme-S zS8wbAi`^)3TiV;tA6Q~TQv68U^W~C8;2F*2u*6T8f##lZ(?3MU->-ZGx5eg61(+`Z z*PKt;qbhD~Y47G88q#yMT#U;;VMkG(`&E%7BWfhQz#;5EZyDsR-?-4Uz&N89$cMM3 z9hvjy@uSyUpFy7q2ico;42x;#&|mkwE4TbkX5)*q;>gQNXK-i$ia*OTW~oz}qEA;O za-SR&OKn^U1o1vweK{TVZDYg8T9@e`PxY(me_c0k9V2(9bt3+ToD!=oy3jEt>`y<{ z(HHPa$8O0$g5^p42oAQ}6$*;}*I_sO*;Be^+uS>3xw;8e>d>Ld=M!(^8d8g+{&=(@ z@-)m7KAaj?m2RloL^~y)4v*w18(JW3^$>4-A%L;P1DIr24MJyjw1Bxgw=?|BYlml5Aico#4NS-0G04>ZV?S@|}U;ihjE8frC!5NQDf6dj?>k~B; zQ|mZjcHBe!b7P2#x#A7CrXV(Pq(;OOgNM?&nM+MbV4~mIdJHkg;9i+|1kq=101iv8 z{({wy@?Z#}iPu@^vHbCLA@e1PW6wuRZU7(*F}$CP#U=hp+ovlj@8omjB%|9T@0pk= zZ=F@EPRB3=RFop%P6bDm^z5CCV?%EdPhA11CPe@%WFJrIK5Nx3T6ya*1$J)2{)G3%O<*@RI1n0DKZGdL1Zv?+Wnr*h!I_SLzI%j24;qj#B< zN%>8!-yJ7xf7~gGMi+b+sz_!c#$v^8H6NXx;_^2(^lG;*hEGt35)J>znGfYHF_;zA zqBrw;iqC`>$hXLb6s16u0{Mz=FYp;|w=|-a7w$_!+A!1~iCS0&VHz)T$!BTdSnWHn zndacwyB+3xQTaVk&5w`By&`wUcaDsfbm;D){(j1RoQuUB+8#13nKV_C=E&zPeoDcM zRg`~(67G(FJYrfh(hmZYH+=yK<`^TL2&BI`lQXBmYftn3AdZL4n-fx!^7?^8!dhQg`1kj)t9p*a=kR0Zq$NRaVdO zFU$Hq4KLKU-)iYRHd-<+XUhBR9`)EJ9w}v*{TQ{8^cf8msCyJn9*NBa_q~K87cy)u zuLLZiD%h4RR{#i3CY}P?=#YEIBf$v#c)%=46ONU*`6`CC zLgyYMv#SvYWHNMbvI|ERT^he57LKKoS0vok>RDue|9K7W_wZp~y*+sV%i)RNWYUZk zGYx(FjxuQ8WH8Egw?EAN^>z5f%#q2VC;~{qnX}0DPmS$Ha8TbKrKa_6kp}h(COE5O zoWFlgwY_GPxjx{zIckmV_7=)uG+B2K`kTl{6MtSlRz&mVtG<7^lv(^UsjjY4e)U#- zpZvS0!P1d6z^bkg9<$Qtj0x=yUufYFXX(;kRTr~w-KYvN+FWbIfYV>HG(~EYe4oL7 zR_RCjJgoBh*AX|>;u$>^E&+x!*Ua$PH~tOy!mQI9WUE}d_m_?JydI{DO+N35C}{M2 ziEv(m>vc9(eU~#mL2&(WTVxP_;O3^bNSFTPCLK(qDdvv`Z$#-EcxCtwRMxR%*Kcs&D&cx_ZOf#{l&r*m*f8f DMY)^2 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Round7/captures/retreat_02.jpg b/Standalone/Research/WorldAssemblerM3/Round7/captures/retreat_02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e237f9d73710d20a5a935e719a203119868279b GIT binary patch literal 12025 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 literal 0 HcmV?d00001 diff --git a/Standalone/Source/StandaloneViewer.cpp b/Standalone/Source/StandaloneViewer.cpp index df3c2cc..1357076 100644 --- a/Standalone/Source/StandaloneViewer.cpp +++ b/Standalone/Source/StandaloneViewer.cpp @@ -1688,6 +1688,8 @@ namespace int32 FlightObservedCrossings=0; uint64 FlightStartCrossingIndex=0; float FlightSpeedMps=16.0f; + std::string FlightCaptureSequencePrefix; + int32 FlightCaptureSequenceIndex=0; bool bFlightStarted=false; bool bFlightFinished=false; bool bFlightClosePosted=false; @@ -5505,6 +5507,29 @@ float3 Lit=Rock*(Ambient+0.88*Diffuse)+float3(0.50,0.69,0.82)*Head*0.75; void CaptureRenderedFrame() { + // Capturer le vol dans la boucle de rendu conserve les transitions LOD. + // Capture the flight inside the render loop to retain LOD transition frames. + if(!FlightCaptureSequencePrefix.empty()&&bFlightStarted) + { + static constexpr std::array CaptureSeconds={0.1,5.0,15.0,25.0,32.0}; + const double FlightElapsed=std::chrono::duration( + std::chrono::steady_clock::now()-FlightStartTime).count(); + if(FlightCaptureSequenceIndex(CaptureSeconds.size()) + &&FlightElapsed>=CaptureSeconds[FlightCaptureSequenceIndex]) + { + char Suffix[16]{}; + std::snprintf(Suffix,sizeof(Suffix),"_%02d.png",FlightCaptureSequenceIndex); + const std::string Path=FlightCaptureSequencePrefix+Suffix; + if(SaveBackBufferPng(Path)) + std::printf("[FlightSequenceCapture] index=%d elapsed_s=%.3f path=%s\n", + FlightCaptureSequenceIndex,FlightElapsed,Path.c_str()); + else + std::fprintf(stderr,"[FlightSequenceCapture] index=%d failed path=%s\n", + FlightCaptureSequenceIndex,Path.c_str()); + ++FlightCaptureSequenceIndex; + std::fflush(stdout); + } + } const bool bReadyToCapture=bCaptureAfterClipmap?bInitialClipmapReported:IsFullDetailUploaded(); if(CapturePath.empty()||bAutoCaptureWritten||!bReadyToCapture)return; bAutoCaptureWritten=SaveBackBufferPng(CapturePath); @@ -8964,6 +8989,9 @@ int main(int Argc,char** Argv) { const std::string_view Arg=Argv[I]; if(Arg.starts_with("--capture="))App.CapturePath=std::string(Arg.substr(10)); + else if(Arg.starts_with("--capture-flight-sequence-prefix=")) + App.FlightCaptureSequencePrefix=std::string( + Arg.substr(std::string_view("--capture-flight-sequence-prefix=").size())); else if(Arg=="--no-vsync")App.bDisableVSync=true; else if(Arg.starts_with("--frame-limit=")) {FrameLimitHz=std::clamp(std::atoi(std::string(Arg.substr(14)).c_str()),1,60);bFrameLimitSpecified=true;}