diff --git a/Models/Bouncing_Ball/sm_contact_ball.slx b/Models/Bouncing_Ball/sm_contact_ball.slx index 615a1f6..da82e11 100644 Binary files a/Models/Bouncing_Ball/sm_contact_ball.slx and b/Models/Bouncing_Ball/sm_contact_ball.slx differ diff --git a/Models/Bouncing_Ball/sm_contact_ball_plot1time.m b/Models/Bouncing_Ball/sm_contact_ball_plot1time.m index 9de34ed..df989c2 100644 --- a/Models/Bouncing_Ball/sm_contact_ball_plot1time.m +++ b/Models/Bouncing_Ball/sm_contact_ball_plot1time.m @@ -3,7 +3,7 @@ % % % -% Copyright 2016-2020 The MathWorks, Inc. +% Copyright 2016-2021 The MathWorks, Inc. % Reuse figure if it exists, else create new figure if ~exist('h1_sm_contact_ball', 'var') || ... diff --git a/Models/Contact_Pairs/sm_contact_pairs.slx b/Models/Contact_Pairs/sm_contact_pairs.slx index 080f4c5..ff7fcd3 100644 Binary files a/Models/Contact_Pairs/sm_contact_pairs.slx and b/Models/Contact_Pairs/sm_contact_pairs.slx differ diff --git a/Models/Point_Cloud_StrWhl/sm_point_cloud_steering_wheel.slx b/Models/Point_Cloud_StrWhl/sm_point_cloud_steering_wheel.slx new file mode 100644 index 0000000..8d85d80 Binary files /dev/null and b/Models/Point_Cloud_StrWhl/sm_point_cloud_steering_wheel.slx differ diff --git a/Models/Point_Cloud_StrWhl/sm_point_cloud_steering_wheel_adjust.m b/Models/Point_Cloud_StrWhl/sm_point_cloud_steering_wheel_adjust.m new file mode 100644 index 0000000..a13e3eb --- /dev/null +++ b/Models/Point_Cloud_StrWhl/sm_point_cloud_steering_wheel_adjust.m @@ -0,0 +1,14 @@ +%% Read in Steering Wheel STL file +% Copyright 2021 The MathWorks, Inc. +steering_wheel_ptCloud = stlread('steering_wheel_orig.STL'); + +%% Move Steering wheel to center of solid +steering_wheel_ctr = ... + triangulation(... + steering_wheel_ptCloud.ConnectivityList,... + steering_wheel_ptCloud.Points-((max(steering_wheel_ptCloud.Points)-min(steering_wheel_ptCloud.Points))/2)-min(steering_wheel_ptCloud.Points)); + +%% Write new steering wheel file +stlwrite(steering_wheel_ctr,'steering_wheel_ctr.stl') + + \ No newline at end of file diff --git a/Models/Point_Cloud_StrWhl/steering_wheel_ctr.stl b/Models/Point_Cloud_StrWhl/steering_wheel_ctr.stl new file mode 100644 index 0000000..c62ea6a Binary files /dev/null and b/Models/Point_Cloud_StrWhl/steering_wheel_ctr.stl differ diff --git a/Models/Point_Cloud_StrWhl/steering_wheel_orig.STL b/Models/Point_Cloud_StrWhl/steering_wheel_orig.STL new file mode 100644 index 0000000..5559c21 Binary files /dev/null and b/Models/Point_Cloud_StrWhl/steering_wheel_orig.STL differ diff --git a/README.md b/README.md index fdfa1f5..07c42f3 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # **Spatial Contact Force Block Examples in Simscape Multibody™** -Copyright 2020 The MathWorks, Inc. +Copyright 2021 The MathWorks, Inc. This repository contains a set of examples that demonstrate the [Spatial Contact Force block](https://www.mathworks.com/help/physmod/sm/ref/spatialcontactforce.html). The examples cover: * **Solid-to-solid contact** between parameterized solids like bricks, spheres, and cylinders * **Contact between CAD geometry** including STEP files. +* **[Point Cloud](https://www.mathworks.com/help/physmod/sm/ref/pointcloud.html) definition** for efficient contact modeling of complex shapes. Open the project file Spatial_Contact_Force_Examples.prj to get started. @@ -19,3 +20,6 @@ To learn more about contact modeling with Simscape Multibody, please visit: * [Simscape Electrical™](https://www.mathworks.com/products/simscape-electrical.html) * [Simscape Fluids™](https://www.mathworks.com/products/simscape-fluids.html) * [Simscape Multibody™](https://www.mathworks.com/products/simscape-multibody.html) + +This submission uses the [S^2 Sampling Toolbox](https://www.mathworks.com/matlabcentral/fileexchange/37004-suite-of-functions-to-perform-uniform-sampling-of-a-sphere) +Anton Semechko (2022). Suite of functions to perform uniform sampling of a sphere (https://github.com/AntonSemechko/S2-Sampling-Toolbox), GitHub. Retrieved March 24, 2022. \ No newline at end of file diff --git a/Scripts_Data/Point_Cloud/Point_Cloud_Data_Brick.m b/Scripts_Data/Point_Cloud/Point_Cloud_Data_Brick.m new file mode 100644 index 0000000..fa71892 --- /dev/null +++ b/Scripts_Data/Point_Cloud/Point_Cloud_Data_Brick.m @@ -0,0 +1,142 @@ +function ptcld = Point_Cloud_Data_Brick(x,y,z,pointset,varargin) +%Point_Cloud_Data_Brick Produce point cloud for exterior surface of a brick +% [ptcld] = Point_Cloud_Data_Brick(x,y,z) +% +% You can specify: +% x length along (first column of ptcld) +% y length along (second column of ptcld) +% z length along (third column of ptcld) +% pointset 'full': corners, edges, and faces +% 'corners': corners only +% Point cloud data will be centered at [0,0,0] +% +% Copyright 2021-2022 The MathWorks, Inc. + +% Default data to show diagram +if (nargin == 0) + x = 3; + y = 2; + z = 1; + pointset = 'full'; +end + +% Check if plot should be produced +if (isempty(varargin)) + showplot = 'n'; +else + showplot = varargin; +end + +ptcld_corners = [... + 1 -1 -1; + 1 1 -1; + -1 -1 -1; + -1 1 -1; + 1 -1 1; + 1 1 1; + -1 -1 1; + -1 1 1; + ]; + +ptcld_face_ctr = [... + 1 0 0; + -1 0 0; + 0 -1 0; + 0 1 0; + 0 0 -1; + 0 0 1; + ]; + +ptcld_edges = [... + 1 -1 0; + 1 1 0; + -1 -1 0; + -1 1 0; + 1 0 1; + -1 0 1; + 1 0 -1; + -1 0 -1; + 0 -1 -1; + 0 1 -1; + 0 -1 1; + 0 1 1; + ]; + +ptcld_faces = [... + 1 0.5 0.5; + 1 0.5 -0.5; + 1 -0.5 0.5; + 1 -0.5 -0.5; + -1 0.5 0.5; + -1 0.5 -0.5; + -1 -0.5 0.5; + -1 -0.5 -0.5; + 0.5 1 0.5; + 0.5 1 -0.5; + -0.5 1 0.5; + -0.5 1 -0.5; + 0.5 -1 0.5; + 0.5 -1 -0.5; + -0.5 -1 0.5; + -0.5 -1 -0.5; + 0.5 0.5 1; + 0.5 -0.5 1; + -0.5 0.5 1; + -0.5 -0.5 1; + 0.5 0.5 -1; + 0.5 -0.5 -1; + -0.5 0.5 -1; + -0.5 -0.5 -1; + ]; + +switch pointset + case 'full' + ptcld = [... + ptcld_corners + ptcld_face_ctr + ptcld_edges + ptcld_faces].*[x y z]/2; + case 'corners' + ptcld = [... + ptcld_corners].*[x y z]/2; +end + +% Plot diagram to show parameters and extrusion +if (nargin == 0 || strcmpi(showplot,'plot')) + + % Figure name + figString = ['h1_' mfilename]; + % Only create a figure if no figure exists + figExist = 0; + fig_hExist = evalin('base',['exist(''' figString ''')']); + if (fig_hExist) + figExist = evalin('base',['ishandle(' figString ') && strcmp(get(' figString ', ''type''), ''figure'')']); + end + if ~figExist + fig_h = figure('Name',figString); + assignin('base',figString,fig_h); + else + fig_h = evalin('base',figString); + end + figure(fig_h) + clf(fig_h) + + temp_colororder = get(gca,'defaultAxesColorOrder'); + + plot3(ptcld(:,1),ptcld(:,2),ptcld(:,3),'o','MarkerFaceColor',temp_colororder(2,:)) + hold on + + xlabel(['x = ' num2str(x)],'Color','r'); + ylabel(['y = ' num2str(y)],'Color','g'); + zlabel(['z = ' num2str(z)],'Color','b'); + + DT = delaunayTriangulation(ptcld); + [K,~] = convexHull(DT); + trisurf(K,DT.Points(:,1),DT.Points(:,2),DT.Points(:,3),'FaceColor',[0.6 0.6 0.9],'EdgeColor',[0.6 0.6 0.9],'FaceAlpha',0.3) + + title(['[ptcld] = Point\_Cloud\_Data\_Brick(x, y, z, pointset);']); + hold off + box on + axis equal + grid off +end \ No newline at end of file diff --git a/Scripts_Data/Point_Cloud/Point_Cloud_Data_Circle.m b/Scripts_Data/Point_Cloud/Point_Cloud_Data_Circle.m new file mode 100644 index 0000000..0410d3f --- /dev/null +++ b/Scripts_Data/Point_Cloud/Point_Cloud_Data_Circle.m @@ -0,0 +1,72 @@ +function ptcld = Point_Cloud_Data_Circle(radius,numpts,varargin) +%Point_Cloud_Data_Circle Produce point cloud for area within a circle +% [ptcld] = Point_Cloud_Data_Circle(radius,numpts) +% +% You can specify: +% radius circle radius +% numpts number of points +% +% Point cloud data will be centered at [0,0,0] +% +% Copyright 2021-2022 The MathWorks, Inc. + +% Default data to show diagram +if (nargin == 0) + radius = 5; + numpts = 100; + showplot = 'plot'; +end + +% Check if plot should be produced +if (isempty(varargin)) + showplot = 'n'; +else + showplot = varargin; +end + +ptcld=[0 0 0]; +golden_angle = pi * (3 - sqrt(5)); + +for i = 1:numpts + theta = i*golden_angle; + r = sqrt(i)/sqrt(numpts); + ptcld(i,:) = [r*cos(theta) r*sin(theta) 0]*radius; +end + + +% Plot diagram to show parameters and extrusion +if (nargin == 0 || strcmpi(showplot,'plot')) + + % Figure name + figString = ['h1_' mfilename]; + % Only create a figure if no figure exists + figExist = 0; + fig_hExist = evalin('base',['exist(''' figString ''')']); + if (fig_hExist) + figExist = evalin('base',['ishandle(' figString ') && strcmp(get(' figString ', ''type''), ''figure'')']); + end + if ~figExist + fig_h = figure('Name',figString); + assignin('base',figString,fig_h); + else + fig_h = evalin('base',figString); + end + figure(fig_h) + clf(fig_h) + + temp_colororder = get(gca,'defaultAxesColorOrder'); + + plot3(ptcld(:,1),ptcld(:,2),ptcld(:,3),'o','MarkerFaceColor',temp_colororder(2,:)) + hold on + + angles = 0:0.1:2*pi; + plot3(sin(angles)*radius,cos(angles)*radius,zeros(size(angles)),'b') + plot3([0 radius],[0 0],[0 0],'b-d','MarkerFaceColor','b','LineWidth',1) + text(radius/2,0,0,'radius','Color','blue') + + title(['[ptcld] = Point\_Cloud\_Data\_Circle(radius, height, numpts);']); + hold off + box on + axis equal + grid off +end \ No newline at end of file diff --git a/Scripts_Data/Point_Cloud/Point_Cloud_Data_Cylinder.m b/Scripts_Data/Point_Cloud/Point_Cloud_Data_Cylinder.m new file mode 100644 index 0000000..3ad7781 --- /dev/null +++ b/Scripts_Data/Point_Cloud/Point_Cloud_Data_Cylinder.m @@ -0,0 +1,121 @@ +function ptcld = Point_Cloud_Data_Cylinder(radius,height,numpts,caps,varargin) +%Point_Cloud_Data_Cylinder Produce point cloud for exterior surface of a cylinder +% [ptcld] = Point_Cloud_Data_Cylinder(radius,height,numpts,caps) +% +% You can specify: +% radius Cylinder radius +% height Cylinder height +% caps Add points on ends (true/false) +% numpts Estimated number of points about circumference +% Points on cylinder ends will be in addition +% to this estimate, placed at the same points/area +% as on the cylinder circumference +% +% Point cloud data will be centered at [0,0,0] +% +% Copyright 2022 The MathWorks, Inc. + +% Default data to show diagram +if (nargin == 0) + radius = 5; + height = 5; + caps = true; + numpts = 100; + showplot = 'plot'; +end + +% Check if plot should be produced +if (isempty(varargin)) + showplot = 'n'; +else + showplot = varargin; +end + +% Calculate cylinder circumference +cyl_cir = 2*pi*radius; + +% Starting point for search +n_h = 2; +n_c = 6; + +% Increase number of points along height and about circumference +% until number of points meets or exceeds request +while (n_h*n_c<=numpts) + n_h = n_h+2; % Always add 2 lines of points about circumference + box_h = height/n_h; % Calculate separate of points about circumference + n_c = floor(cyl_cir/(box_h*2)); % Calculate vertical point separation +end + +% Calculate angle vectors for staggered rings about circumference +ang_ca = linspace(0,2*pi-(2*pi/n_c),n_c); +ang_cb = ang_ca+pi/n_c; + +% Assemble point cloud, ring by ring +ptcld = []; +for i = 0:n_h + if(rem(i,2)==0) + pts_x = cos(ang_ca)*radius; + pts_y = sin(ang_ca)*radius; + else + pts_x = cos(ang_cb)*radius; + pts_y = sin(ang_cb)*radius; + end + pts_z = i/n_h*height*ones(size(pts_x))-height/2; + ptcld = [ptcld;pts_x' pts_y' pts_z']; +end + +if(caps) + pts_per_area = size(ptcld,1)/(cyl_cir*height); + area_end = pi*(radius-box_h/2)^2; + pts_end = ceil(area_end*pts_per_area); + + pts_end = Point_Cloud_Data_Circle(radius-box_h/2,pts_end); + + pts_end(:,3) = height/2; + ptcld = [ptcld; pts_end]; + pts_end(:,3) = -height/2; + ptcld = [ptcld; pts_end]; +end + + +% Plot diagram to show parameters and extrusion +if (nargin == 0 || strcmpi(showplot,'plot')) + + % Figure name + figString = ['h1_' mfilename]; + % Only create a figure if no figure exists + figExist = 0; + fig_hExist = evalin('base',['exist(''' figString ''')']); + if (fig_hExist) + figExist = evalin('base',['ishandle(' figString ') && strcmp(get(' figString ', ''type''), ''figure'')']); + end + if ~figExist + fig_h = figure('Name',figString); + assignin('base',figString,fig_h); + else + fig_h = evalin('base',figString); + end + figure(fig_h) + clf(fig_h) + + temp_colororder = get(gca,'defaultAxesColorOrder'); + + plot3(ptcld(:,1),ptcld(:,2),ptcld(:,3),'o','MarkerFaceColor',temp_colororder(2,:)) + hold on + + plot3([0 0],[0 0],[-1 1]*height/2,'b-d','MarkerFaceColor','b','LineWidth',1) + text(radius*0.05,radius*0.05,0,'height','Color','blue') + + plot3([0 radius],[0 0],[1 1]*height/2,'k-d','MarkerFaceColor','k','LineWidth',1) + text(radius/2,0,height*0.45,'radius','Color','black') + + DT = delaunayTriangulation(ptcld); + [K,~] = convexHull(DT); + trisurf(K,DT.Points(:,1),DT.Points(:,2),DT.Points(:,3),'FaceColor',[0.6 0.6 0.9],'EdgeColor',[0.6 0.6 0.9],'FaceAlpha',0.3) + + title(['[ptcld] = Point\_Cloud\_Data\_Cylinder(radius, height, caps, numpts);']); + hold off + box on + axis equal + grid off +end \ No newline at end of file diff --git a/Scripts_Data/Point_Cloud/Point_Cloud_Data_Sphere.m b/Scripts_Data/Point_Cloud/Point_Cloud_Data_Sphere.m new file mode 100644 index 0000000..8bd655f --- /dev/null +++ b/Scripts_Data/Point_Cloud/Point_Cloud_Data_Sphere.m @@ -0,0 +1,67 @@ +function ptcld = Point_Cloud_Data_Sphere(radius,numpts,varargin) +%Point_Cloud_Data_Sphere Produce point cloud for exterior surface of a sphere +% [ptcld] = Point_Cloud_Data_Sphere(radius,numpts) +% +% You can specify: +% radius sphere radius +% numpts number of points +% +% Point cloud data will be centered at [0,0,0] +% +% Copyright 2021-2022 The MathWorks, Inc. + +% Default data to show diagram +if (nargin == 0) + radius = 0.5; + numpts = 100; + showplot = 'plot'; +end + +% Check if plot should be produced +if (isempty(varargin)) + showplot = 'n'; +else + showplot = varargin; +end + +[ptcld,~,~,~]=ParticleSampleSphere('N',numpts,'upd',false); + +ptcld = ptcld*radius; + +% Plot diagram to show parameters and extrusion +if (nargin == 0 || strcmpi(showplot,'plot')) + + % Figure name + figString = ['h1_' mfilename]; + % Only create a figure if no figure exists + figExist = 0; + fig_hExist = evalin('base',['exist(''' figString ''')']); + if (fig_hExist) + figExist = evalin('base',['ishandle(' figString ') && strcmp(get(' figString ', ''type''), ''figure'')']); + end + if ~figExist + fig_h = figure('Name',figString); + assignin('base',figString,fig_h); + else + fig_h = evalin('base',figString); + end + figure(fig_h) + clf(fig_h) + + temp_colororder = get(gca,'defaultAxesColorOrder'); + + plot3(ptcld(:,1),ptcld(:,2),ptcld(:,3),'o','MarkerFaceColor',temp_colororder(2,:)) + hold on + + plot3([0 0],[0 0],[0 radius],'b-d','MarkerFaceColor','b','LineWidth',1) + text(radius*0.05,radius*0.05,radius*0.5,'radius','Color','blue') + DT = delaunayTriangulation(ptcld); + [K,~] = convexHull(DT); + trisurf(K,DT.Points(:,1),DT.Points(:,2),DT.Points(:,3),'FaceColor',[0.6 0.6 0.9],'EdgeColor',[0.6 0.6 0.9],'FaceAlpha',0.3) + + title(['[ptcld] = Point\_Cloud\_Data\_Sphere(radius, numpts);']); + hold off + box on + axis equal + grid off +end \ No newline at end of file diff --git a/Scripts_Data/Point_Cloud/Resources/ClosedMeshVolume.m b/Scripts_Data/Point_Cloud/Resources/ClosedMeshVolume.m new file mode 100644 index 0000000..d2c6536 --- /dev/null +++ b/Scripts_Data/Point_Cloud/Resources/ClosedMeshVolume.m @@ -0,0 +1,39 @@ +function Vol=ClosedMeshVolume(TR) +% Compute volume of a region enclosed by a triangular surface mesh. +% +% INPUT: +% - TR : input surface mesh represented as an object of 'TriRep' +% class, 'triangulation' class, or a cell such that TR={Tri,V}, +% where Tri is an M-by-3 array of faces and V is an N-by-3 +% array of vertex coordinates. +% +% OUTPUT: +% - Vol : real number specifying volume enclosed by TR. Vol<0 means +% that the order of mesh vertices in the face connectivity list +% is in the clockwise direction, as viewed from the outside the +% mesh. +% +% AUTHOR: Anton Semechko (a.semechko@gmail.com) +% + + +% Face and vertex lists +[Tri,V]=GetMeshData(TR); +if size(Tri,2)~=3 + error('This function is intended ONLY for triangular surface meshes') +end + +% Face vertices +V1=V(Tri(:,1),:); +V2=V(Tri(:,2),:); +V3=V(Tri(:,3),:); + +% Face centroids +C=(V1+V2+V3)/3; + +% Face normals +FN=cross(V2-V1,V3-V1,2); + +% Volume +Vol=sum(dot(C,FN,2))/6; + diff --git a/Scripts_Data/Point_Cloud/Resources/GetMeshData.m b/Scripts_Data/Point_Cloud/Resources/GetMeshData.m new file mode 100644 index 0000000..cfc84b1 --- /dev/null +++ b/Scripts_Data/Point_Cloud/Resources/GetMeshData.m @@ -0,0 +1,56 @@ +function [Tri,X,fmt]=GetMeshData(TR) +% Get face-vertex connectivity list and list of vertex coordinates of a +% mesh (TR) represented in one of the following formats: +% +% (1) 'triangulation' object, +% (2) 'TriRep' object, +% (3) 1-by-2 cell such that TR={Tri,V}, where Tri is a M-by-3 or M-by-4 +% array of elements and V is a N-by-3 array of vertex coordinates, or +% (4) structure with fields 'faces' and 'vertices', such that +% Tri=TR.faces, and V=TR.vertices, where Tri and V have the same +% meaning as in (3). +% +% OUTPUT: +% - Tri : M-by-3 array of face-vertex connectivities when TR is +% triangular mesh, and M-by-4 array when TR is a quad or tet +% mesh. +% - X : N-by-3 array of vertex coordinates +% - fmt : mesh format (see above) +% +% AUTHOR: Anton Semechko (a.semechko@gmail.com) +% + + +% Get face and vertex lists +if isa(TR,'triangulation') + Tri=TR.ConnectivityList; + X=TR.Points; + fmt=1; +elseif isa(TR,'TriRep') + Tri=TR.Triangulation; + X=TR.X; + fmt=2; +elseif iscell(TR) && numel(TR)==2 + Tri=TR{1}; + X=TR{2}; + fmt=3; +elseif isstruct(TR) && isfield(TR,'faces') && isfield(TR,'vertices') + Tri=TR.faces; + X=TR.vertices; + fmt=4; +else + error('Unrecognized mesh format') +end +if fmt<3, return; end + +% Check that face and vertex lists have correct dimensions +c=size(Tri,2); +if ~isnumeric(Tri) || ~ismatrix(Tri) || c<3 || c>4 || ~isequal(Tri,round(Tri)) || any(Tri(:)<0) + error('Vertex connectivity list must be specified as a M-by-(3 or 4) array of POSITIVE integers') +end + +d=size(X,2); +if ~isnumeric(X) || ~ismatrix(X) || any(~isfinite(X(:))) || d<2 || d>3 + error('List of vertex coordinates must be specified as a N-by-2 or N-by-3 array of real numbers') +end + diff --git a/Scripts_Data/Point_Cloud/Resources/ParticleSampleSphere.m b/Scripts_Data/Point_Cloud/Resources/ParticleSampleSphere.m new file mode 100644 index 0000000..afde58e --- /dev/null +++ b/Scripts_Data/Point_Cloud/Resources/ParticleSampleSphere.m @@ -0,0 +1,561 @@ +function [V,Tri,Ue_i,Ue]=ParticleSampleSphere(varargin) +% Generate an approximately uniform triangular tessellation of a unit +% sphere by minimizing generalized electrostatic potential energy +% (i.e., Reisz s-energy) of a system of charged particles. Effectively, +% this function produces a locally optimal solution to the problem that +% involves finding a minimum Reisz s-energy configuration of N equally +% charged particles confined to the surface of a unit sphere; s=1 +% corresponds to the problem originally posed by J.J. Thomson. +% +% SYNTAX: +% [V,Tri,Ue_i,Ue]=ParticleSampleSphere(option_i,value_i,option_j,value_j,...) +% +% INPUT PARAMETERS/OPTIONS: +% - 'N' : positive integer specifying either the desired number of +% particles or antipodal particle pairs ( see 'asym' option +% below). Default settings for 'N' is 200 when 'asym'=false +% and 100 when 'asym'=true. If 'N' exceeds 1E3, user will be +% prompted to manually verify if he wishes to continue. Set +% 'qdlg' to false to disable manual verification when N>1E3. +% The lowest permissible number of particles is 14. +% - 'Vo' : array of particle positions used to initialize the search. +% This input is optional and should be used in place of 'N' +% when suboptimal initial configuration of particles is +% available. Corresponding value of 'Vo' must be a N-by-3 +% array of particle coordinates, where N the number of +% particles (or antipodal particle pairs if 'asym' is true). +% Note that initializations consisting of more than 1E3 +% particles (or particle pairs) are admissible, but may lead +% to unreasonably long optimization times. +% - 's' : Reisz s-energy parameter used to control the strength of +% particle interactions; higher values of 's' lead to stronger +% short-range interactions . 's' must be a real number greater +% than zero. 's'=1 is the default setting. +% - 'asym' : compute antipodally symmetric particle configurations. Set +% 'asym' to true to obtain a uniformly distributed set of 2N +% particles comprised of N antipodal particle pairs. Recall, +% an antipodal partner of particle P is -P (i.e., P reflected +% through the origin). 'asym'=false is the default setting. +% - 'Etol' : absolute energy convergence tolerance. Optimization will +% terminate when change in potential energy between two +% consecutive iterations falls below Etol. 'Etol'=1E-5 is the +% default setting. +% - 'Dtol' : maximum particle displacement tolerance (in degrees). +% Optimization will terminate when maximum displacement of any +% particle between two consecutive iteration is less than +% Dtol. 'Dtol'=1E-4 is the default setting. +% - 'Nitr' : maximum number of iterations. Nitr must be a non-negative +% integer. 'Nitr'=1E4 is the default setting. +% - 'upd' : progress update. Set 'upd' to false to disable progress +% updates. 'upd'=true is the default setting. +% - 'qdlg' : default maximum particle limit verification. Set 'qdlg' to +% false to disable the question dialog pop-up prompting the +% user to indicate if they wish to continue when N>1E3. +% 'qdlg'=true is the default setting. +% +% REMAINS TO BE IMPLEMENTED +% - 'CO' : connectivity optimization. To obtain particle configurations +% with fewer dislocations (i.e., vertices possessing either +% less or more than 6 neighbours) set 'CO' to true. 'CO'=false +% is the default setting. +% +% OUTPUT: +% - V : N-by-3 array of vertex (i.e., particle) coordinates. When +% 'asym'=true, -V(i,:) is the antipodal partner of V(i,:). +% - Tri : M-by-3 list of face-vertex connectivities. When 'asym'=false, +% Tri is triangulation of V. When 'asym'=true, Tri is +% triangulation of 2N particles [V;-V]. +% - Ue_i : N-by-1 array of particle (or particle pair) energies. +% - Ue : k-by-1 array of potential energy values, where k-1 is the +% total number of iterations. Ue(1) and Ue(k) correspond to the +% potential energies of the initial and final particle +% configurations, respectively. +% +% +% EXAMPLE 1: Uniformly distribute 200 particles across the surface of a +% unit sphere +% ------------------------------------------------------------------------- +% % Sample +% [V,Tri,~,Ue]=ParticleSampleSphere('N',200); +% +% % Visualize optimization progress +% figure('color','w') +% subplot(1,2,1) +% plot(log10(1:numel(Ue)),Ue,'.-') +% set(get(gca,'Title'),'String','Optimization Progress','FontSize',40) +% set(gca,'FontSize',20,'XColor','k','YColor','k') +% xlabel('log_{10}(Iteration #)','FontSize',30,'Color','k') +% ylabel('Reisz s-Energy','FontSize',30,'Color','k') +% +% % Visualize mesh +% subplot(1,2,2) +% h=patch('faces',Tri,'vertices',V); +% set(h,'EdgeColor','b','FaceColor','w') +% axis equal +% hold on +% plot3(V(:,1),V(:,2),V(:,3),'.k','MarkerSize',15) +% set(gca,'XLim',[-1.1 1.1],'YLim',[-1.1 1.1],'ZLim',[-1.1 1.1]) +% view(3) +% grid off +% set(get(gca,'Title'),'String','N=200 (base mesh)','FontSize',30) +% ------------------------------------------------------------------------- +% +% +% EXAMPLE 2: Uniformly distribute 100 antipodally symmetric particle pairs +% across the surface of a unit sphere +% ------------------------------------------------------------------------- +% %Sample +%[V,Tri,~,Ue]=ParticleSampleSphere('N',100,'asym',true); + +% %Visualize optimization progress +%figure('color','w') +%subplot(1,2,1) +%plot(log10(1:numel(Ue)),Ue,'.-') +%set(get(gca,'Title'),'String','Optimization Progress','FontSize',40) +%set(gca,'FontSize',20,'XColor','k','YColor','k') +%xlabel('log_{10}(Iteration #)','FontSize',30,'Color','k') +%ylabel('Reisz s-Energy','FontSize',30,'Color','k') + +% %Visualize mesh. Note that vertices of the mesh are [V;-V] and not [V] +% %used in the previous example. This is because -V are antipodal partners +% %of V. However, just like in the previous example, computed mesh is also +% composed of 200 vertices. +%subplot(1,2,2) +%fv=struct('faces',Tri,'vertices',[V;-V]); +%h=patch(fv); +%set(h,'EdgeColor','b','FaceColor','w') +%axis equal +%set(gca,'XLim',[-1.1 1.1],'YLim',[-1.1 1.1],'ZLim',[-1.1 1.1]) +%view(3) +%grid off +%hold on +%plot3(V(:,1),V(:,2),V(:,3),'.k','MarkerSize',15) +%plot3(-V(:,1),-V(:,2),-V(:,3),'.r','MarkerSize',15) +%set(get(gca,'Title'),'String','Final Mesh','FontSize',30) +% ------------------------------------------------------------------------- +% +% AUTHOR: Anton Semechko (a.semechko@gmail.com) +% + + +% Check the inputs +prms=VerifyInputArgs(varargin); %#ok<*ASGLU> +[V,s,upd,CO]=deal(prms.V,prms.s,prms.upd,prms.CO); + +if prms.Nitr<0 + [Tri,Ue_i,Ue]=deal([]); + return +end +N=size(V,1); % number of particles +prms.Dtol=prms.Dtol/180*pi; +clear varargin + +if prms.Nitr>=0 || nargout>2 + + % Compute geodesic distances between particle pairs + DOT=max(min(V*V',1),-1); % dot product + GD=acos(DOT); % geodesic distance + + % Evaluate potential energy + GD(1:(N+1):end)=Inf; % set diagonal entries to Inf + Ue_ij=1./(eps + GD.^s); + if prms.asym + Ue_ij=Ue_ij + 1./(eps + (pi-GD).^s); + end + Ue_i=sum(Ue_ij,2); + if prms.asym + Ue_i=Ue_i+(1/pi)^s; + end + Ue=sum(Ue_i); + + % Approximate average distance between two neighbouring particles + if prms.asym + d_ave=sqrt(8/sqrt(3)*pi/(2*N-2)); + else + d_ave=sqrt(8/sqrt(3)*pi/(N-2)); + end + if acos(1-d_ave^2/2)<1E-12 + fprintf(2,'Number of particles exceeds critical limit. Unable to continue due to limited numerical precision of ''acos'' function.\n') + [Tri,Ue_i,Ue]=deal([]); + return + end + d_thr=max(1E-3*d_ave,1E-14); + +end + +% Iteratively optimize particle positions along negative gradient of +% potential energy using an adaptive Gauss-Seidel update scheme +% ------------------------------------------------------------------------- +if upd && prms.Nitr>0 + fprintf('\nWait while particle positions are being optimized ...\n') + t0=clock; +end + +a_min=1E-15; % minimum step size +a_max=1; % maximum step size +a=a_max*ones(N,1)/2; % step sizes used during position updates + +idx_jo=true(N,1); +[dE,dV]=deal(Inf); +Vrec=repmat({V},[1 10]); + +i=0; +while iprms.Etol && dV>prms.Dtol + + i=i+1; + + % Sort particles according to their energy contribution + [~,idx_sort]=sort(abs(Ue_i-mean(Ue_i)),'descend'); + + % Update positions of individual particles (or particle pairs) + dV_max=0; + for k=1:N + + j=idx_sort(k); + + idx_j=idx_jo; + idx_j(j)=false; % particle indices, except the current one + + % Potential energy gradient of the j-th particle + DOTj=DOT(idx_j,j); + GDj=GD(idx_j,j); + + dVj=bsxfun(@times,s./(eps + sqrt(1-DOTj.^2)),V(idx_j,:)); + if prms.asym + dVj=bsxfun(@rdivide,dVj,eps + GDj.^(s+1)) - bsxfun(@rdivide,dVj,eps + (pi-GDj).^(s+1)); + else + dVj=bsxfun(@rdivide,dVj,eps + GDj.^(s+1)); + end + + if min(GDj) + end + + dV_max=2; + break + + end + + end + dVj=sum(dVj,1); + + % Only retain tangential component of the gradient + dVj_n=(dVj*V(j,:)')*V(j,:); + dVj_t=dVj-dVj_n; + + % Update position of the j-th particle + m=0; + Uj_old=sum(Ue_ij(j,:)); + while m<50 + + m=m+1; + + % Update position of the j-th particle + Vj_new=V(j,:)-a(j)*dVj_t; + Vj_new=Vj_new/norm(Vj_new); + + % Recompute dot products and geodesic distances + DOTj=max(min(V*Vj_new(:),1),-1); + GDj=acos(DOTj); + GDj(j)=Inf; + + Ue_ij_j=1./(eps + GDj.^s); + if prms.asym + Ue_ij_j=Ue_ij_j + 1./(eps + (pi-GDj).^s); + end + + % Check if the system potential decreased + if sum(Ue_ij_j)a_min + a(j)=max(a(j)/1.1,a_min); + else + break + end + + end + + end + + end + + % Evaluate net potential energy of the system + Ue_i=sum(Ue_ij,2); + if prms.asym, Ue_i=Ue_i + (1/pi)^s; end + Ue(i+1)=sum(Ue_i); + + % Maximum displacement (in radians) + dV_max=acos(1-dV_max^2/2); + Vrec{10}=V; + Vrec=circshift(Vrec,[0 -1]); + + % Average change in potential energy + if i>=10 + [dE,dE2]=deal((Ue(end-10)-Ue(end))/10); + dV=dV_max; + elseif i==1 + dE2=(Ue(1)-Ue(end))/i; + end + + % Progress update + if upd && ((mod(i,400)==0 && i>100) || i==1) + fprintf('\n%-15s %-15s %-15s %-15s %-15s\n','Iteration #','log(Energy/N)','log(dE/Etol)','log(dV/Dtol)','Time (sec)') + end + + if upd && (mod(i,10)==0 || i==1) + fprintf('%-15u %-15.11f %-15.2f %-15.2f %-15.1f\n',i,log10(Ue(end)/size(V,1)),log10(max(dE2,eps)/prms.Etol),log10(max(dV_max,eps)/prms.Dtol),etime(clock,t0)) + end + + % Reset step sizes; to avoid premature convergence + if mod(i,40)==0 + a_max=min(a_max,5*max(a)); + a(:)=a_max; + end + +end +clear DOT GD Ue_ij + +if upd && (mod(i,10)~=0 && i>1) + fprintf('%-15u %-15.11f %-15.2f %-15.2f %-15.1f\n',i,log10(Ue(end)/size(V,1)),log10(dE/prms.Etol),log10(dV_max/prms.Dtol),etime(clock,t0)) +end + +if upd && prms.Nitr>0 + fprintf('Optimization terminated after %u iterations. Elapsed time: %5.1f sec\n',i,etime(clock,t0)) + fprintf('Convergence tolerances: Etol=%.6e, Dtol=%.6e degrees\n',prms.Etol,prms.Dtol/pi*180) +end + +if ~prms.user_init + if prms.asym + idx=V(:,3)<0; + V(idx,:)=-V(idx,:); + end + [~,id_srt]=sort(V(:,3),'descend'); + V=V(id_srt,:); + Ue_i=Ue_i(id_srt); +end + + +% Triangulate particle positions +if nargout>1 + if prms.asym + Tri=convhull([V;-V]); + if ClosedMeshVolume({Tri [V;-V]})<0, Tri=fliplr(Tri); end + else + Tri=convhull(V); + if ClosedMeshVolume({Tri V})<0, Tri=fliplr(Tri); end + end +end + + +%========================================================================== +function prms=VerifyInputArgs(VarsIn) +% Make sure user-defined input arguments have valid format + +% Default settings +prms.V=[]; +prms.s=1; +prms.Etol=1E-5; +prms.Dtol=1E-4; +prms.Nitr=1E4; +prms.asym=false; +prms.upd=true; +prms.CO=false; +prms.qdlg=true; +prms.user_init=false; +if isempty(VarsIn) + prms.V=RandSampleSphere; + return; +end + +% Check that there is an even number of inputs +Narg=numel(VarsIn); +if mod(Narg,2)~=0 + error('This function only accepts name-value parameter pairs as inputs') +end + +% Check user-defined parameters +FNo={'N','Vo','s','asym','Etol','Dtol','Nitr','upd','CO','qdlg'}; +flag=false(1,numel(FNo)); exit_flag=false; +N=[]; +for i=1:Narg/2 + + % Make sure the input is a string + str=VarsIn{2*(i-1)+1}; + if ~ischar(str) || numel(str)>4 + error('Input argument #%u is not a valid paramer name',2*(i-1)+1) + end + + % Get parameter "value" + Val=VarsIn{2*i}; + + % Match the string against the list of available options + chk=strcmpi(str,FNo); + id=find(chk,1); + if isempty(id), id=0; end + + switch id + case 1 % number of particles (or particle pairs) + + % Check if 'initialization' option has also been specified + if flag(2) + error('Ambiguous combination of input parameters. Specify ''%s'' or ''%s'', but not both.',FNo{2},FNo{1}) + end + N=Val; + + case 2 % initialization + + % Check if 'number' option has also been specified + if flag(1) + error('Ambiguous combination of input parameters. Specify ''%s'' or ''%s'', but not both.',FNo{1},FNo{2}) + end + + % Check the format + if ~ismatrix(Val) || ~isnumeric(Val) || size(Val,2)~=3 || size(Val,1)<14 || any(~isfinite(Val(:))) + error('Incorrect entry for ''%s''. ''%s'' must be set to a N-by-3 array, where N is the number of particles (or particle pairs).',FNo{2},FNo{2}) + end + + % Make sure particles are on the unit sphere + prms.V=ProjectOnSn(Val); + prms.user_init=true; + N=size(prms.V,1); + + case 3 % s parameter + + % Check the format + if numel(Val)~=1 || ~isnumeric(Val) || ~isfinite(Val) || Val<1E-6 + error('Incorrect entry for the ''%s'' parameter. ''%s'' must be set to a positive real number.',FNo{3},FNo{3}) + end + prms.s=Val; + + case 4 % antipodal particle pairs + + % Check format + if numel(Val)~=1 || ~islogical(Val) + error('Incorrect entry for ''%s''. ''%s'' must be set to true or false.',FNo{4},FNo{4}) + end + prms.asym=Val; + + case 5 % energy tolerance + + % Check format + if numel(Val)~=1 || ~isnumeric(Val) || ~isfinite(Val) || Val1E3 + + % Check format + if numel(Val)~=1 || ~islogical(Val) + error('Incorrect entry for ''%s''. ''%s'' must be set to true or false.',FNo{10},FNo{10}) + end + prms.qdlg=Val; + + otherwise + error('''%s'' is not a recognized parameter name',str) + end + flag(id)=true; + +end + + +if ~isempty(N) + chk=numel(N)~=1 | ~isnumeric(N) | any(~isfinite(N(:))) | ~isequal(round(N),N); + if chk || (prms.asym && N<7) || (~prms.asym && N<14) + error('Incorrect entry for ''N''. Total number of particles must be greater than 13.') + end +else + N=200; +end + +if isempty(prms.V) + prms.V=RandSampleSphere(N); +end + +% Check if there are more than 1E3 particles +if N>1E3 && prms.qdlg + + % Construct a 'yes'/'no' questdlg + choice = questdlg('Default particle limit exceeded. Would you like to continue?', ... + 'Particle Limit Exceeded',' YES ',' NO ',' NO '); + + % Handle response + if strcmpi(choice,' NO '), exit_flag=true; end + +end + +if exit_flag, prms.Nitr=-1; end %#ok<*UNRCH> + diff --git a/Scripts_Data/Point_Cloud/Resources/RandSampleSphere.m b/Scripts_Data/Point_Cloud/Resources/RandSampleSphere.m new file mode 100644 index 0000000..f8b1fc4 --- /dev/null +++ b/Scripts_Data/Point_Cloud/Resources/RandSampleSphere.m @@ -0,0 +1,78 @@ +function X=RandSampleSphere(N,spl) +% Generate a uniform or stratified sampling of a unit sphere. +% +% INPUTS: +% - N : desired number of point samples. N=200 is default. +% - spl : can be 'uniform' or 'stratified'. The former setting is used by +% default. +% +% OUTPUT: +% - X : N-by-3 array of sample point coordinates. +% +% REFERENCE: +% - Shao & Badler, 1996, Spherical Sampling by Archimedes' Theorem +% +% AUTHOR: Anton Semechko (a.semechko@gmail.com) +% + + +% Default arguments +if nargin<1 || isempty(N), N=200; end +if nargin<2 || isempty(spl), spl='uniform'; end + +% Basic error checking +chk=strcmpi(spl,{'uniform','stratified'}); +if sum(chk)==0 + error('Invalid sampling option') +end + +N=round(N); +if numel(N)~=1 || ~isnumeric(N) || N<1 + error('Invalid entry for 1st input argument (N)') +end +if N<3, spl='uniform'; end + +% Sample the unfolded right cylinder +if strcmp(spl,'stratified') + + % Partition the [-1,1]x[0,2*pi] domain into ceil(sqrt(N))^2 subdomains + % and then draw a random sample for each + n=ceil(sqrt(N)); + ds=2/n; + [Xc,Yc]=meshgrid((-1+ds/2):ds:(1-ds/2)); + + x=ds*(rand(n^2,1)-0.5); + y=ds*(rand(n^2,1)-0.5); + + x=x+Xc(:); + y=y+Yc(:); + clear Xc Yc + + % Remove excess samples + R=n^2-N; + if R>0 + idx=randperm(n^2,R); + x(idx)=[]; + y(idx)=[]; + end + + lon=(x+1)*pi; + z=y; + +else + z=2*rand(N,1)-1; + lon=2*pi*rand(N,1); +end + +% Convert z to latitude +z(z<-1)=-1; +z(z>1)=1; +lat=acos(z); + +% Convert spherical to rectangular co-ords +s=sin(lat); +x=cos(lon).*s; +y=sin(lon).*s; + +X=[x,y,z]; + diff --git a/Scripts_Data/Point_Cloud/Resources/S2_Sampling_Toolbox.rights b/Scripts_Data/Point_Cloud/Resources/S2_Sampling_Toolbox.rights new file mode 100644 index 0000000..715f4e1 --- /dev/null +++ b/Scripts_Data/Point_Cloud/Resources/S2_Sampling_Toolbox.rights @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Anton Semechko + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. \ No newline at end of file diff --git a/Scripts_Data/shutdown_contact_examples_basic.m b/Scripts_Data/shutdown_contact_examples_basic.m index 2db4d29..e3b1290 100644 --- a/Scripts_Data/shutdown_contact_examples_basic.m +++ b/Scripts_Data/shutdown_contact_examples_basic.m @@ -1,5 +1,5 @@ % Shutdown script for custom project -% Copyright 2019-2020 The MathWorks, Inc. +% Copyright 2019-2021 The MathWorks, Inc. %% Code for cleaning Simscape custom library at shutdown % Change to folder with package directory diff --git a/Scripts_Data/startup_contact_examples_basic.m b/Scripts_Data/startup_contact_examples_basic.m index c853f92..5698357 100644 --- a/Scripts_Data/startup_contact_examples_basic.m +++ b/Scripts_Data/startup_contact_examples_basic.m @@ -1,5 +1,5 @@ % Startup script for project Aileron_Act.prj -% Copyright 2018-2020 The MathWorks, Inc. +% Copyright 2018-2021 The MathWorks, Inc. %% Code for building Simscape custom library at startup % Change to folder with package directory diff --git a/resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/VdPmBMwoDf7Z0K1nUWaLWFgZOKAd.xml b/resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/VdPmBMwoDf7Z0K1nUWaLWFgZOKAd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/VdPmBMwoDf7Z0K1nUWaLWFgZOKAd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/VdPmBMwoDf7Z0K1nUWaLWFgZOKAp.xml b/resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/VdPmBMwoDf7Z0K1nUWaLWFgZOKAp.xml new file mode 100644 index 0000000..01288a4 --- /dev/null +++ b/resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/VdPmBMwoDf7Z0K1nUWaLWFgZOKAp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/1OOd1UEJkiTVzNCxj97k1dAcnNwd.xml b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/1OOd1UEJkiTVzNCxj97k1dAcnNwd.xml new file mode 100644 index 0000000..d7095e6 --- /dev/null +++ b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/1OOd1UEJkiTVzNCxj97k1dAcnNwd.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/1OOd1UEJkiTVzNCxj97k1dAcnNwp.xml b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/1OOd1UEJkiTVzNCxj97k1dAcnNwp.xml new file mode 100644 index 0000000..18db7f0 --- /dev/null +++ b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/1OOd1UEJkiTVzNCxj97k1dAcnNwp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/_YItvumeQHFbpQPBT72aLEl74H8d.xml b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/_YItvumeQHFbpQPBT72aLEl74H8d.xml new file mode 100644 index 0000000..92a37c4 --- /dev/null +++ b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/_YItvumeQHFbpQPBT72aLEl74H8d.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/_YItvumeQHFbpQPBT72aLEl74H8p.xml b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/_YItvumeQHFbpQPBT72aLEl74H8p.xml new file mode 100644 index 0000000..38d6307 --- /dev/null +++ b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/_YItvumeQHFbpQPBT72aLEl74H8p.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/r9bPhkRR0A-49Xx7Frj3RY4idB0d.xml b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/r9bPhkRR0A-49Xx7Frj3RY4idB0d.xml new file mode 100644 index 0000000..506fe97 --- /dev/null +++ b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/r9bPhkRR0A-49Xx7Frj3RY4idB0d.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/r9bPhkRR0A-49Xx7Frj3RY4idB0p.xml b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/r9bPhkRR0A-49Xx7Frj3RY4idB0p.xml new file mode 100644 index 0000000..6e09d24 --- /dev/null +++ b/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/r9bPhkRR0A-49Xx7Frj3RY4idB0p.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/aDBINLl9TNdUIwcVNWLKGgIdcqAd.xml b/resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/aDBINLl9TNdUIwcVNWLKGgIdcqAd.xml new file mode 100644 index 0000000..bca89d1 --- /dev/null +++ b/resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/aDBINLl9TNdUIwcVNWLKGgIdcqAd.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/aDBINLl9TNdUIwcVNWLKGgIdcqAp.xml b/resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/aDBINLl9TNdUIwcVNWLKGgIdcqAp.xml new file mode 100644 index 0000000..621cb6a --- /dev/null +++ b/resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/aDBINLl9TNdUIwcVNWLKGgIdcqAp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/1vfZXntWRGCorFflcKohe10lVBc/0cLr0F_gPpEGj0kTI-yVY9hryycp.xml b/resources/project/L27hhvoEQPDe9gR9eM6kYu60gv8/TZYxY3ZomM7p2fRamzuZ53Ygmn8p.xml similarity index 100% rename from resources/project/1vfZXntWRGCorFflcKohe10lVBc/0cLr0F_gPpEGj0kTI-yVY9hryycp.xml rename to resources/project/L27hhvoEQPDe9gR9eM6kYu60gv8/TZYxY3ZomM7p2fRamzuZ53Ygmn8p.xml diff --git a/resources/project/0cLr0F_gPpEGj0kTI-yVY9hryyc/urDW5By9xZokpTbyzI1SBCYHiWQd.xml b/resources/project/TZYxY3ZomM7p2fRamzuZ53Ygmn8/By4odZuAtEJSo4XIFvncDytqoIYd.xml similarity index 100% rename from resources/project/0cLr0F_gPpEGj0kTI-yVY9hryyc/urDW5By9xZokpTbyzI1SBCYHiWQd.xml rename to resources/project/TZYxY3ZomM7p2fRamzuZ53Ygmn8/By4odZuAtEJSo4XIFvncDytqoIYd.xml diff --git a/resources/project/0cLr0F_gPpEGj0kTI-yVY9hryyc/urDW5By9xZokpTbyzI1SBCYHiWQp.xml b/resources/project/TZYxY3ZomM7p2fRamzuZ53Ygmn8/By4odZuAtEJSo4XIFvncDytqoIYp.xml similarity index 100% rename from resources/project/0cLr0F_gPpEGj0kTI-yVY9hryyc/urDW5By9xZokpTbyzI1SBCYHiWQp.xml rename to resources/project/TZYxY3ZomM7p2fRamzuZ53Ygmn8/By4odZuAtEJSo4XIFvncDytqoIYp.xml diff --git a/resources/project/Tpa2TdYQyLNeWJn7EF8wbNd7gFU/1vfZXntWRGCorFflcKohe10lVBcp.xml b/resources/project/Tpa2TdYQyLNeWJn7EF8wbNd7gFU/1vfZXntWRGCorFflcKohe10lVBcp.xml deleted file mode 100644 index a4b68b4..0000000 --- a/resources/project/Tpa2TdYQyLNeWJn7EF8wbNd7gFU/1vfZXntWRGCorFflcKohe10lVBcp.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/resources/project/Tpa2TdYQyLNeWJn7EF8wbNd7gFU/1vfZXntWRGCorFflcKohe10lVBcd.xml b/resources/project/Tpa2TdYQyLNeWJn7EF8wbNd7gFU/L27hhvoEQPDe9gR9eM6kYu60gv8d.xml similarity index 100% rename from resources/project/Tpa2TdYQyLNeWJn7EF8wbNd7gFU/1vfZXntWRGCorFflcKohe10lVBcd.xml rename to resources/project/Tpa2TdYQyLNeWJn7EF8wbNd7gFU/L27hhvoEQPDe9gR9eM6kYu60gv8d.xml diff --git a/resources/project/Tpa2TdYQyLNeWJn7EF8wbNd7gFU/L27hhvoEQPDe9gR9eM6kYu60gv8p.xml b/resources/project/Tpa2TdYQyLNeWJn7EF8wbNd7gFU/L27hhvoEQPDe9gR9eM6kYu60gv8p.xml new file mode 100644 index 0000000..3ea497d --- /dev/null +++ b/resources/project/Tpa2TdYQyLNeWJn7EF8wbNd7gFU/L27hhvoEQPDe9gR9eM6kYu60gv8p.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/0RNBXpZiYBjji9VBhkCDyah9VMgd.xml b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/0RNBXpZiYBjji9VBhkCDyah9VMgd.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/0RNBXpZiYBjji9VBhkCDyah9VMgd.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/0RNBXpZiYBjji9VBhkCDyah9VMgp.xml b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/0RNBXpZiYBjji9VBhkCDyah9VMgp.xml new file mode 100644 index 0000000..5199d61 --- /dev/null +++ b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/0RNBXpZiYBjji9VBhkCDyah9VMgp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/4Wm4iUCRT9fGGSqPGSzVPrju_QMd.xml b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/4Wm4iUCRT9fGGSqPGSzVPrju_QMd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/4Wm4iUCRT9fGGSqPGSzVPrju_QMd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/4Wm4iUCRT9fGGSqPGSzVPrju_QMp.xml b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/4Wm4iUCRT9fGGSqPGSzVPrju_QMp.xml new file mode 100644 index 0000000..42e99cd --- /dev/null +++ b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/4Wm4iUCRT9fGGSqPGSzVPrju_QMp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/OFpAf5ObX9LuBg3dv1iE0o6_Licd.xml b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/OFpAf5ObX9LuBg3dv1iE0o6_Licd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/OFpAf5ObX9LuBg3dv1iE0o6_Licd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/OFpAf5ObX9LuBg3dv1iE0o6_Licp.xml b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/OFpAf5ObX9LuBg3dv1iE0o6_Licp.xml new file mode 100644 index 0000000..2f1441e --- /dev/null +++ b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/OFpAf5ObX9LuBg3dv1iE0o6_Licp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/d6sN41JdJA7FwzU1-WcKmsd0tn8d.xml b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/d6sN41JdJA7FwzU1-WcKmsd0tn8d.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/d6sN41JdJA7FwzU1-WcKmsd0tn8d.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/d6sN41JdJA7FwzU1-WcKmsd0tn8p.xml b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/d6sN41JdJA7FwzU1-WcKmsd0tn8p.xml new file mode 100644 index 0000000..b99611e --- /dev/null +++ b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/d6sN41JdJA7FwzU1-WcKmsd0tn8p.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/s_q3-Snv0qY5H-ZkDTUeL17bg6Yd.xml b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/s_q3-Snv0qY5H-ZkDTUeL17bg6Yd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/s_q3-Snv0qY5H-ZkDTUeL17bg6Yd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/s_q3-Snv0qY5H-ZkDTUeL17bg6Yp.xml b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/s_q3-Snv0qY5H-ZkDTUeL17bg6Yp.xml new file mode 100644 index 0000000..7999889 --- /dev/null +++ b/resources/project/VdPmBMwoDf7Z0K1nUWaLWFgZOKA/s_q3-Snv0qY5H-ZkDTUeL17bg6Yp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/-sLIV28VIpSy1XpNQph6NAXQcB4d.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/-sLIV28VIpSy1XpNQph6NAXQcB4d.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/-sLIV28VIpSy1XpNQph6NAXQcB4d.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/-sLIV28VIpSy1XpNQph6NAXQcB4p.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/-sLIV28VIpSy1XpNQph6NAXQcB4p.xml new file mode 100644 index 0000000..636f0fa --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/-sLIV28VIpSy1XpNQph6NAXQcB4p.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/1YJq51rw0VK1Fwmi92it4HTn0iYd.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/1YJq51rw0VK1Fwmi92it4HTn0iYd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/1YJq51rw0VK1Fwmi92it4HTn0iYd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/1YJq51rw0VK1Fwmi92it4HTn0iYp.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/1YJq51rw0VK1Fwmi92it4HTn0iYp.xml new file mode 100644 index 0000000..b6f10d5 --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/1YJq51rw0VK1Fwmi92it4HTn0iYp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/2DHToO-n7CTd0wQ7zn_ulhJqswYd.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/2DHToO-n7CTd0wQ7zn_ulhJqswYd.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/2DHToO-n7CTd0wQ7zn_ulhJqswYd.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/2DHToO-n7CTd0wQ7zn_ulhJqswYp.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/2DHToO-n7CTd0wQ7zn_ulhJqswYp.xml new file mode 100644 index 0000000..5199d61 --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/2DHToO-n7CTd0wQ7zn_ulhJqswYp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/3lEXNw-RrR1UfjQqWvWadaKtDVYd.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/3lEXNw-RrR1UfjQqWvWadaKtDVYd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/3lEXNw-RrR1UfjQqWvWadaKtDVYd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/3lEXNw-RrR1UfjQqWvWadaKtDVYp.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/3lEXNw-RrR1UfjQqWvWadaKtDVYp.xml new file mode 100644 index 0000000..2b81077 --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/3lEXNw-RrR1UfjQqWvWadaKtDVYp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/TBZR3jS5mR2-rSXSAJ_iI1BAvEcd.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/TBZR3jS5mR2-rSXSAJ_iI1BAvEcd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/TBZR3jS5mR2-rSXSAJ_iI1BAvEcd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/TBZR3jS5mR2-rSXSAJ_iI1BAvEcp.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/TBZR3jS5mR2-rSXSAJ_iI1BAvEcp.xml new file mode 100644 index 0000000..7af404d --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/TBZR3jS5mR2-rSXSAJ_iI1BAvEcp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/gMiLbB3GTMtCoG45qiCjcNex-_gd.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/gMiLbB3GTMtCoG45qiCjcNex-_gd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/gMiLbB3GTMtCoG45qiCjcNex-_gd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/gMiLbB3GTMtCoG45qiCjcNex-_gp.xml b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/gMiLbB3GTMtCoG45qiCjcNex-_gp.xml new file mode 100644 index 0000000..cd88b56 --- /dev/null +++ b/resources/project/ZE_nLDGzpvhDN-N-yzi1rGDHtUs/gMiLbB3GTMtCoG45qiCjcNex-_gp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/Km5kTX3Wn-HWFluUggAgpJ8DKqod.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/Km5kTX3Wn-HWFluUggAgpJ8DKqod.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/Km5kTX3Wn-HWFluUggAgpJ8DKqod.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/Km5kTX3Wn-HWFluUggAgpJ8DKqop.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/Km5kTX3Wn-HWFluUggAgpJ8DKqop.xml new file mode 100644 index 0000000..669b597 --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/Km5kTX3Wn-HWFluUggAgpJ8DKqop.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/UTeHbAYS4FOm9BUf14my6Tf0qykd.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/UTeHbAYS4FOm9BUf14my6Tf0qykd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/UTeHbAYS4FOm9BUf14my6Tf0qykd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/UTeHbAYS4FOm9BUf14my6Tf0qykp.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/UTeHbAYS4FOm9BUf14my6Tf0qykp.xml new file mode 100644 index 0000000..e5fd82e --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/UTeHbAYS4FOm9BUf14my6Tf0qykp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/ZE_nLDGzpvhDN-N-yzi1rGDHtUsd.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/ZE_nLDGzpvhDN-N-yzi1rGDHtUsd.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/ZE_nLDGzpvhDN-N-yzi1rGDHtUsd.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/ZE_nLDGzpvhDN-N-yzi1rGDHtUsp.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/ZE_nLDGzpvhDN-N-yzi1rGDHtUsp.xml new file mode 100644 index 0000000..46c8677 --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/ZE_nLDGzpvhDN-N-yzi1rGDHtUsp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/_nC4YeBwljeMJC5LhofxnpK3YZsd.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/_nC4YeBwljeMJC5LhofxnpK3YZsd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/_nC4YeBwljeMJC5LhofxnpK3YZsd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/_nC4YeBwljeMJC5LhofxnpK3YZsp.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/_nC4YeBwljeMJC5LhofxnpK3YZsp.xml new file mode 100644 index 0000000..a9e8ccd --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/_nC4YeBwljeMJC5LhofxnpK3YZsp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/crLHVtDakr7mMHJz33ybIUf_gu8d.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/crLHVtDakr7mMHJz33ybIUf_gu8d.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/crLHVtDakr7mMHJz33ybIUf_gu8d.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/crLHVtDakr7mMHJz33ybIUf_gu8p.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/crLHVtDakr7mMHJz33ybIUf_gu8p.xml new file mode 100644 index 0000000..5199d61 --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/crLHVtDakr7mMHJz33ybIUf_gu8p.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/jAVkZZ2ciTW26HbvA3CBwVLW-BMd.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/jAVkZZ2ciTW26HbvA3CBwVLW-BMd.xml new file mode 100644 index 0000000..3c16f79 --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/jAVkZZ2ciTW26HbvA3CBwVLW-BMd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/jAVkZZ2ciTW26HbvA3CBwVLW-BMp.xml b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/jAVkZZ2ciTW26HbvA3CBwVLW-BMp.xml new file mode 100644 index 0000000..cac0c55 --- /dev/null +++ b/resources/project/d6E4R1F3YjZ3l819p-LthcjQCHI/jAVkZZ2ciTW26HbvA3CBwVLW-BMp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/ojME0DLi1acAi9d0fF737hnpvFQ/d6E4R1F3YjZ3l819p-LthcjQCHId.xml b/resources/project/ojME0DLi1acAi9d0fF737hnpvFQ/d6E4R1F3YjZ3l819p-LthcjQCHId.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/resources/project/ojME0DLi1acAi9d0fF737hnpvFQ/d6E4R1F3YjZ3l819p-LthcjQCHId.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/ojME0DLi1acAi9d0fF737hnpvFQ/d6E4R1F3YjZ3l819p-LthcjQCHIp.xml b/resources/project/ojME0DLi1acAi9d0fF737hnpvFQ/d6E4R1F3YjZ3l819p-LthcjQCHIp.xml new file mode 100644 index 0000000..e59f9f5 --- /dev/null +++ b/resources/project/ojME0DLi1acAi9d0fF737hnpvFQ/d6E4R1F3YjZ3l819p-LthcjQCHIp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file