Discussion:
[OpenSCAD] Parabolic Trough
EdEarl
2013-08-31 16:45:56 UTC
Permalink
This is not a necessarily a project to print on a 3D printer.

I projected a plane through a cone to make a parabola (see code below), and
placed three small spheres at known points on the parabola, the center and
ends. There are several things I need to know to be able to build a
parabolic trough and a supporting structure, for example to build a solar
trough.

UNKNOWNS
1. focal point
2. length of material for the parabola
3. other points to attach supports

The formula for a conic section is as follows:
Ax^2 + Bxy + Cy^2 +Dx + Ey + F = 0 with A, B, C not all zero

The information I have found about this formula suggest that the values for
A-F may need to be imaginary numbers. But, I have not found a definitive
source that clearly relates the geometry of a conic section to this formula.

Anyone have any suggestions on how I may proceed to complete the design of
my solar trough with a supporting structure and size of material to make the
parabolic trough?

ParabolicTrough() ;

module ParabolicTrough() {
ConeHeight=100;
ConeRadius=ConeHeight;
Center=sqrt(ConeRadius*ConeRadius/2);

translate([0,-Center,ConeHeight/2]) sphere(r=5);
translate([ConeRadius,0,ConeHeight/2]) sphere(r=5);
translate([-ConeRadius,0,ConeHeight/2]) sphere(r=5);
linear_extrude(height=ConeHeight) projection(cut=true)
rotate([atan(ConeHeight/ConeRadius),0,0])
difference() {
cylinder(h=ConeHeight*1.02, r1=ConeRadius*1.02, r2=0);
cylinder(h=ConeHeight, r1=ConeRadius, r2=0);
}
};




--
View this message in context: http://forum.openscad.org/Parabolic-Trough-tp5362.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
Doug Mcnutt
2013-08-31 20:08:30 UTC
Permalink
Post by EdEarl
This is not a necessarily a project to print on a 3D printer.
I projected a plane through a cone to make a parabola (see code below), and
placed three small spheres at known points on the parabola, the center and
ends. There are several things I need to know to be able to build a
parabolic trough and a supporting structure, for example to build a solar
trough.
UNKNOWNS
1. focal point
2. length of material for the parabola
3. other points to attach supports
Ax^2 + Bxy + Cy^2 +Dx + Ey + F = 0 with A, B, C not all zero
The information I have found about this formula suggest that the values for
A-F may need to be imaginary numbers. But, I have not found a definitive
source that clearly relates the geometry of a conic section to this formula.
Anyone have any suggestions on how I may proceed to complete the design of
my solar trough with a supporting structure and size of material to make the
parabolic trough?
ParabolicTrough() ;
module ParabolicTrough() {
ConeHeight=100;
ConeRadius=ConeHeight;
Center=sqrt(ConeRadius*ConeRadius/2);
translate([0,-Center,ConeHeight/2]) sphere(r=5);
translate([ConeRadius,0,ConeHeight/2]) sphere(r=5);
translate([-ConeRadius,0,ConeHeight/2]) sphere(r=5);
linear_extrude(height=ConeHeight) projection(cut=true)
rotate([atan(ConeHeight/ConeRadius),0,0])
difference() {
cylinder(h=ConeHeight*1.02, r1=ConeRadius*1.02, r2=0);
cylinder(h=ConeHeight, r1=ConeRadius, r2=0);
}
};
You know a whole lot more than I do about programming openscad. I am frustrated with other CAD programs in that, knowing a formula in algebra seldom helps in the process of drawing curves. Anyway I have a couple of comments about analytic geometry that might be helpful.

The parabola you want can be defined as a locus of points that are equidistant from a line and a point, not on the line. The point is called the focus and the line is called the directrix. The focal length is half of the distance from the focus to the directrix. A point at the "bottom center" of the parabola is at the halfway point.

A useful 2-D formula, easily derived from that, is simply y = k * x^2 with a constant added if you don't want the parabola to pass through (0,0).

It ought to be easy to enter that curve formula with some limits and extrude it into a solid. Vectorworks can't do it. I'm not sure about AutoCAD or pro-engineer.

Your formula for the conic section is too general because it includes elipses and hyperbole. If you simplify it to include intersections only with a plane parallel to one of the cone's sides, meaning one of the lines that rotate around a point to create the cone. Setting B, C, D, and E to zero might be a start.

Cones have two knappes that go awav from the vertex in two directions. Ellipses occur when the intersecting plane goes thru only one knappe. Hyperbolas are on planes that cut both knappes. Parabolas are on the special planes in between the two.
--
1801 - Joseph Marie Jacquard uses punch cards to instruct a loom to weave "hello, world" into a tapestry.
EdEarl
2013-08-31 21:49:55 UTC
Permalink
Post by Doug Mcnutt
A useful 2-D formula, easily derived from that, is simply y = k * x^2 with
a constant added if you don't want the parabola to pass through (0,0).
It ought to be easy to enter that curve formula with some limits and
extrude it into a solid. Vectorworks can't do it. I'm not sure about
AutoCAD or pro-engineer.
Actually, I'm new to OpenSCAD, but have much experience programming. AFAIK
there is no way to write an OpenSCAD program to make a parabola using y = k
* x^2, it was the first thing I tried.

I have been retired from programming for several years, and my computers
have had few programming tools for a long time. I've loaded Emacs, Inkscape,
make and am currently relearning some things I've forgotten. I can write an
Emacs Lisp program to make a polygon shaped as a parabola, as you suggest
using y = k * x^2.

I can use Inkscape to draw other polygons, rather than hand coding them
using OpenSCAD. But, Inkscape does not generate a parabola, AFAIK. Thus,
OpenSCAD is only one tool required to complete a complex project.

On Linux, I might integrate Emacs and OpenSCAD by making OpenSCAD a server
that Emacs uses, but my Windows machine is newer and has much more memory,
so it is the best one for rendering with OpenSCAD. Unfortunately, OpenSCAD
has no api interface that Emacs can use. Thus, I cannot marry them together
using Windows. :(
Post by Doug Mcnutt
Your formula for the conic section is too general because it includes
elipses and hyperbole. If you simplify it to include intersections only
with a plane parallel to one of the cone's sides, meaning one of the lines
that rotate around a point to create the cone. Setting B, C, D, and E to
zero might be a start.
Cones have two knappes that go awav from the vertex in two directions.
Ellipses occur when the intersecting plane goes thru only one knappe.
Hyperbolas are on planes that cut both knappes. Parabolas are on the
special planes in between the two.
TYVM for the info.



--
View this message in context: http://forum.openscad.org/Parabolic-Trough-tp5362p5364.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
David Powell
2013-09-01 00:13:49 UTC
Permalink
quite an interesting one ,, and yea 3d printing i think would be out as
getting the surface smooth enough would be rather hard with current tech ,
by the same token the openscad output it is going be a mesh of triangles
that is also not a true curve, that would be a problem if you are using
the result output for cnc

I would think its more usual to know the focal length and diameter of the
mirror or f ratio

as to manufacture one possible option is centrifugal ,, if you spin a dish
of mercury it will produce a perfect paribolic reflector , the same is true
of other liquids , maybe spinning molten abs and letting it set while still
spinning could produce one with a smooth surface aluminium foil then
applied like you would gold leaf would give it a nice reflective surface

you need to start with a known point like the focal point , and for n
number of divisions of the dia of the reflector plot the radius profile
shape on the x y , as a 2d object , once you have that you can rotate
extrude it , that would give you the profile to the accuracy of the number
of divisions , but could take quite a few hours to render
Post by EdEarl
Post by Doug Mcnutt
A useful 2-D formula, easily derived from that, is simply y = k * x^2
with
Post by Doug Mcnutt
a constant added if you don't want the parabola to pass through (0,0).
It ought to be easy to enter that curve formula with some limits and
extrude it into a solid. Vectorworks can't do it. I'm not sure about
AutoCAD or pro-engineer.
Actually, I'm new to OpenSCAD, but have much experience programming. AFAIK
there is no way to write an OpenSCAD program to make a parabola using y = k
* x^2, it was the first thing I tried.
I have been retired from programming for several years, and my computers
have had few programming tools for a long time. I've loaded Emacs, Inkscape,
make and am currently relearning some things I've forgotten. I can write an
Emacs Lisp program to make a polygon shaped as a parabola, as you suggest
using y = k * x^2.
I can use Inkscape to draw other polygons, rather than hand coding them
using OpenSCAD. But, Inkscape does not generate a parabola, AFAIK. Thus,
OpenSCAD is only one tool required to complete a complex project.
On Linux, I might integrate Emacs and OpenSCAD by making OpenSCAD a server
that Emacs uses, but my Windows machine is newer and has much more memory,
so it is the best one for rendering with OpenSCAD. Unfortunately, OpenSCAD
has no api interface that Emacs can use. Thus, I cannot marry them together
using Windows. :(
Post by Doug Mcnutt
Your formula for the conic section is too general because it includes
elipses and hyperbole. If you simplify it to include intersections only
with a plane parallel to one of the cone's sides, meaning one of the
lines
Post by Doug Mcnutt
that rotate around a point to create the cone. Setting B, C, D, and E to
zero might be a start.
Cones have two knappes that go awav from the vertex in two directions.
Ellipses occur when the intersecting plane goes thru only one knappe.
Hyperbolas are on planes that cut both knappes. Parabolas are on the
special planes in between the two.
TYVM for the info.
--
http://forum.openscad.org/Parabolic-Trough-tp5362p5364.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
_______________________________________________
OpenSCAD mailing list
http://rocklinux.net/mailman/listinfo/openscad
http://openscad.org - https://flattr.com/thing/121566
Don Bright
2013-09-01 01:16:19 UTC
Permalink
Hi Ed,

Have you considered using a Dandelin Sphere approach? This code modifies
yours to show the Dandelin Sphere inscribed in your cone (the inner 'skin'
of your cone) based on some guesswork. The point where the sphere
intersects the x-y plane should be the focus (I didnt show this, but you
can probably figure it out using some union() ).


ParabolicTrough() ;


module ParabolicTrough() {

ConeHeight=100;

ConeRadius=ConeHeight;

Center=sqrt(ConeRadius*ConeRadius/2);

DandelinRadius=ConeRadius/(2*sqrt(2));

DandelinY=-ConeHeight/(2*sqrt(2));


translate([0,-Center,ConeHeight/2]) sphere(r=5);

translate([ConeRadius,0,ConeHeight/2]) sphere(r=5);

translate([-ConeRadius,0,ConeHeight/2]) sphere(r=5);

color("blue",0.5) translate([0,DandelinY,DandelinRadius])
sphere(DandelinRadius);


//linear_extrude(height=ConeHeight)

//projection(cut=true)

rotate([atan(ConeHeight/ConeRadius),0,0])

color("gold",0.5)

difference() {

cylinder(h=ConeHeight*1.02, r1=ConeRadius*1.02, r2=0);

cylinder(h=ConeHeight, r1=ConeRadius, r2=0);

}

};
Post by EdEarl
This is not a necessarily a project to print on a 3D printer.
I projected a plane through a cone to make a parabola (see code below), and
placed three small spheres at known points on the parabola, the center and
ends. There are several things I need to know to be able to build a
parabolic trough and a supporting structure, for example to build a solar
trough.
UNKNOWNS
1. focal point
2. length of material for the parabola
3. other points to attach supports
Ax^2 + Bxy + Cy^2 +Dx + Ey + F = 0 with A, B, C not all zero
The information I have found about this formula suggest that the values for
A-F may need to be imaginary numbers. But, I have not found a definitive
source that clearly relates the geometry of a conic section to this formula.
Anyone have any suggestions on how I may proceed to complete the design of
my solar trough with a supporting structure and size of material to make the
parabolic trough?
ParabolicTrough() ;
module ParabolicTrough() {
ConeHeight=100;
ConeRadius=ConeHeight;
Center=sqrt(ConeRadius*ConeRadius/2);
translate([0,-Center,ConeHeight/2]) sphere(r=5);
translate([ConeRadius,0,ConeHeight/2]) sphere(r=5);
translate([-ConeRadius,0,ConeHeight/2]) sphere(r=5);
linear_extrude(height=ConeHeight) projection(cut=true)
rotate([atan(ConeHeight/ConeRadius),0,0])
difference() {
cylinder(h=ConeHeight*1.02, r1=ConeRadius*1.02,
r2=0);
cylinder(h=ConeHeight, r1=ConeRadius,
r2=0);
}
};
--
http://forum.openscad.org/Parabolic-Trough-tp5362.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
_______________________________________________
OpenSCAD mailing list
http://rocklinux.net/mailman/listinfo/openscad
http://openscad.org - https://flattr.com/thing/121566
EdEarl
2013-09-01 01:35:55 UTC
Permalink
Spinning a liquid makes a parabolic dish, not a parabolic trough. The focus
of a trough is a line, not a point. The focus of a dish is a point.

The Dandelin Spheres must be tangent to both the cone and the plane, and I
don't know how to construct anything tangent in OpenSCAD. However, the
Dandelin Spheres method is nice to know, TYVM for the info.





--
View this message in context: http://forum.openscad.org/Parabolic-Trough-tp5362p5367.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
Don Bright
2013-09-01 01:59:27 UTC
Permalink
You can make the Dandelin sphere tangent by looking at the rotation code
you used to make your cone intersect the plane. Since you have Cone Height
equal to Cone Radius, you have a 45-45-90 triangle and so the Dandelin
sphere has radius 1/ ( 2 sqrt(2) ).

This is easiest to see by switching 'view' / 'perspective' to 'orthogonal'
and then looking at a straight-on side view.

Your code uses a 2d parabolic shape and extrudes it to make the trough. The
same idea can be used to generate a cylinder at the focus of the trough.
Just make your dandelin sphere a tiny bit bigger than it needs to be, and
'projection cut' it just like you did the cone, then extrude the resulting
circle. You will get a cylinder at the focus of the trough.

-DB
Post by EdEarl
Spinning a liquid makes a parabolic dish, not a parabolic trough. The focus
of a trough is a line, not a point. The focus of a dish is a point.
The Dandelin Spheres must be tangent to both the cone and the plane, and I
don't know how to construct anything tangent in OpenSCAD. However, the
Dandelin Spheres method is nice to know, TYVM for the info.
--
http://forum.openscad.org/Parabolic-Trough-tp5362p5367.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
_______________________________________________
OpenSCAD mailing list
http://rocklinux.net/mailman/listinfo/openscad
http://openscad.org - https://flattr.com/thing/121566
Don Bright
2013-09-01 02:02:04 UTC
Permalink
this code will produce a cylinder at the focus.

using the method i outlined above.



ParabolicTrough() ;



module ParabolicTrough() {


ConeHeight=100;


ConeRadius=ConeHeight;


Center=sqrt(ConeRadius*ConeRadius/2);


DandelinRadius=ConeRadius/(2*sqrt(2));


DandelinY=-ConeHeight/(2*sqrt(2));



translate([0,-Center,ConeHeight/2]) sphere(r=5);


translate([ConeRadius,0,ConeHeight/2]) sphere(r=5);


translate([-ConeRadius,0,ConeHeight/2]) sphere(r=5);


linear_extrude(height=ConeHeight)

color("blue",0.5)

projection(cut=true)

translate([0,DandelinY,DandelinRadius]) sphere(DandelinRadius*1.02);



linear_extrude(height=ConeHeight)


projection(cut=true)


rotate([atan(ConeHeight/ConeRadius),0,0])


color("gold",0.5)


difference() {


cylinder(h=ConeHeight*1.02, r1=ConeRadius*1.02, r2=0);


cylinder(h=ConeHeight, r1=ConeRadius, r2=0);


}


};
Post by EdEarl
Spinning a liquid makes a parabolic dish, not a parabolic trough. The focus
of a trough is a line, not a point. The focus of a dish is a point.
The Dandelin Spheres must be tangent to both the cone and the plane, and I
don't know how to construct anything tangent in OpenSCAD. However, the
Dandelin Spheres method is nice to know, TYVM for the info.
--
http://forum.openscad.org/Parabolic-Trough-tp5362p5367.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
_______________________________________________
OpenSCAD mailing list
http://rocklinux.net/mailman/listinfo/openscad
http://openscad.org - https://flattr.com/thing/121566
EdEarl
2013-09-01 02:16:16 UTC
Permalink
Thanks Very Much Don. I'll have to study that one; it works great.



--
View this message in context: http://forum.openscad.org/Parabolic-Trough-tp5362p5370.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
Don Bright
2013-09-01 02:43:02 UTC
Permalink
You are most welcome. Would love to see your project when it's done.
-DB
Post by EdEarl
Thanks Very Much Don. I'll have to study that one; it works great.
--
http://forum.openscad.org/Parabolic-Trough-tp5362p5370.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
_______________________________________________
OpenSCAD mailing list
http://rocklinux.net/mailman/listinfo/openscad
http://openscad.org - https://flattr.com/thing/121566
EdEarl
2013-09-01 03:54:05 UTC
Permalink
I made a correction to the Center formula and some whistles.

ParabolicTrough(Markers=true);
// Markers true displays known points

module ParabolicTrough(Ratio=1, Markers=0) { // Ratio of cone Height to
Radius

ConeHeight=100;
ConeRadius=ConeHeight/Ratio;
Center=sqrt(ConeRadius*ConeRadius+ConeHeight*ConeHeight)/2;

DandelinRadius=ConeRadius/(2*sqrt(2));
DandelinY=-ConeHeight/(2*sqrt(2));

if (Markers) { //if Markers==true then place markers on known points
translate([0,-Center,ConeHeight/2]) sphere(r=3);
translate([ConeRadius,0,ConeHeight/2]) sphere(r=3);
translate([-ConeRadius,0,ConeHeight/2]) sphere(r=3);

linear_extrude(height=ConeHeight)
color("blue",0.5)
projection(cut=true)
translate([0,DandelinY,DandelinRadius]) sphere(DandelinRadius*1.007);
}

linear_extrude(height=ConeHeight)
projection(cut=true)
rotate([atan(ConeHeight/ConeRadius),0,0])
color("gold",0.5)
difference() {
cylinder(h=ConeHeight*1.02, r1=ConeRadius*1.02, r2=0);
cylinder(h=ConeHeight, r1=ConeRadius, r2=0);
};
};




--
View this message in context: http://forum.openscad.org/Parabolic-Trough-tp5362p5372.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
Mark Jeronimus
2013-09-01 09:24:26 UTC
Permalink
Post by EdEarl
Actually, I'm new to OpenSCAD, but have much experience programming. AFAIK
there is no way to write an OpenSCAD program to make a parabola using y
= k
Post by EdEarl
* x^2, it was the first thing I tried.
There is. In 2D, create trapezoidal segments at each calculated coordinate
that span to the next coordinate (so they just touch), extrude them, then
find out the boundaries between the segments conveniently disappeared
(verifyable with CTRL+1). I took the idea from GregFrost's
MCAD.involute_gears.scad.

This should be more useful because the surface of the shapes are the ideal
parabola shape, not the center of the shape like in the examples above)

It's reads a lot easier too imo.

-Mark

//Standard parabola
function parabolaPoint(x, k) = k * x * x;

//Focal point equals Y where derivative of parabolaPoint is 1.
function focal_length(k) = parabolaPoint(0.5 / k, k);

//Cup shape
module outer_parabola(width, k, segments, base_thickness = 1) {
for(i = [-segments:1:segments - 1]) {
assign(x1 = i * width / segments)
assign(x2 = (i + 1) * width / segments)
polygon([[x1, -base_thickness], [x1, parabolaPoint(x1, k)],
[x2, parabolaPoint(x2, k)], [x2, -base_thickness]],
[[3, 2, 1, 0]]);
}
}

//Bulge shape
module inner_parabola(width, k, segments) {
assign(max_y = parabolaPoint(width, k))
for(i = [-segments:1:segments - 1]) {
assign(x1 = i * width / segments)
assign(x2 = (i + 1) * width / segments)
polygon([[x1, max_y], [x1, parabolaPoint(x1, k)],
[x2, parabolaPoint(x2, k)], [x2, max_y]],
[[0, 1, 2, 3]]);
}
}

module parabolic_trough (length, width, k, segments) {
rotate([90, 0, 90])
linear_extrude(length, $fn = segments * 4)
outer_parabola(width, k, segments);
}

module parabolic_dish (width, k, segments) {
rotate_extrude($fn = segments * 4)
intersection() {
outer_parabola(width, k, segments);
translate([0, -1])
square([width + 1, parabolaPoint(width, k) + 2]);
}
}

////////////////////////////////

linear_extrude(1) outer_parabola(10, 0.2, segments = 20);

color("green")
linear_extrude(0.5) inner_parabola(10, 0.2, segments = 20);

echo(str("Focal length = ", focal_length(0.2)));
color("white")
translate([0, focal_length(0.2)])
cylinder(r = 0.25, $fn=20);

translate([-10, 32, 0])
parabolic_trough(20, 10, 0.1, 5);

translate([0, 54, 0])
parabolic_dish(10, 0.05, 5);
EdEarl
2013-09-01 11:00:34 UTC
Permalink
Mark, Thank You Very Much. That program is helpful and will extend my ability
to use OpenSCAD significantly. You have succeeded where I failed previously.
I shall study this program to glean every possible detail. Again, TYVM.



--
View this message in context: http://forum.openscad.org/Parabolic-Trough-tp5362p5377.html
Sent from the OpenSCAD mailing list archive at Nabble.com.
EdEarl
2013-09-02 16:58:30 UTC
Permalink
Here is a toy parabolic trough using Mark's parabola functions, that might be
printed.

<Loading Image...>

Parabolic_Trough_Assembly();
module Parabolic_Trough_Assembly() {
sphere(r=2, $fn=50);
translate([0,0,-6]) cylinder(h=6,r1=3,r2=2,$fn=50);
translate([0,0,-8]) cylinder(h=2,r1=10,r2=3,$fn=50);
translate([0,0,-9]) cylinder(h=1,r=10,$fn=50);
rotate([60,0,0])
translate([-10, 0, 5])
parabolic_trough(20, 10, 0.05, 5);
}

////////////////////////////////

function parabolaPoint(x, k) = k * x * x;

echo(str("Focal length = ", focal_length(0.2)));

//Focal point equals Y where derivative of parabolaPoint is 1.
function focal_length(k) = parabolaPoint(0.5 / k, k);

//Cup shape
module outer_parabola(width, k, segments, base_thickness = 1) {
for(i = [-segments:1:segments - 1]) {
assign(x1 = i * width / segments)
assign(x2 = (i + 1) * width / segments)
assign(pp1 = parabolaPoint(x1, k))
assign(pp2 = parabolaPoint(x2, k))
polygon([[x1, pp1-base_thickness], [x1, pp1],
[x2, pp2], [x2, pp2-base_thickness]],
[[3, 2, 1, 0]]);
}
}

//Base shape
module base_outer_parabola(width, k, segments, base_thickness = 1) {
for(i = [-segments:1:segments - 1]) {
assign(x1 = i * width / segments)
assign(x2 = (i + 1) * width / segments)
assign(pp1 = parabolaPoint(x1, k))
assign(pp2 = parabolaPoint(x2, k))
polygon([[x1, -base_thickness], [x1, pp1],
[x2, pp2], [x2, -base_thickness]],
[[3, 2, 1, 0]]);
}
}

module parabolic_trough(length, width, k, segments) {
rotate([90, 0, 90])
linear_extrude(length, $fn = segments * 4)
outer_parabola(width, k, segments);

translate([7.5, 0, 0])
rotate([90, 0, 90])
linear_extrude(length/4, $fn = segments * 4)
base_outer_parabola(width*0.75, k, segments);

translate([10,0,0]) union() {
polyhedron(
points=[ [length/8, width*0.75,0], [length/8, -width*0.75,0],
[-length/8, -width*0.75,0], [-length/8, width*0.75,0], // base
[0,0,-5] ], // apex
triangles=[ [0,1,4],[1,2,4],[2,3,4],[3,0,4], // each triangle
side
[1,0,3],[2,1,3] ] // two triangles
for square base
);
translate([0,0,-3.75])
cube([length/8,width*3/8,5], center=true);
};
}





--
View this message in context: http://forum.openscad.org/Parabolic-Trough-tp5362p5380.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

Continue reading on narkive:
Loading...