mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-07-14 09:31:48 +08:00
#304 disable minimum resolution.
It can go lower than 0.0125 for the perimeters. It's kept at a minimum of 0.0125 for infill & thinwalls/gapfaill for performance reasons and to avoid too much artifacts / corners case.
This commit is contained in:
parent
fd584f1994
commit
880eb59e73
@ -1,4 +1,5 @@
|
||||
min_slic3r_version = 2.3.0-beta2
|
||||
0.0.5-susi remove resolution to use default
|
||||
0.0.5 Updated end g-code.
|
||||
min_slic3r_version = 2.3.0-alpha2
|
||||
0.0.4 Fixed predator output filaname format, infill overlap.
|
||||
|
@ -5,7 +5,7 @@
|
||||
name = Anycubic
|
||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||
config_version = 0.0.5
|
||||
config_version = 0.0.5-susi
|
||||
# Where to get the updates from?
|
||||
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/
|
||||
# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
|
||||
@ -120,7 +120,6 @@ perimeter_speed = 45
|
||||
post_process =
|
||||
print_settings_id =
|
||||
raft_layers = 0
|
||||
resolution = 0
|
||||
seam_position = nearest
|
||||
single_extruder_multi_material_priming = 0
|
||||
skirts = 2
|
||||
@ -502,7 +501,6 @@ perimeter_extrusion_width = 0.45
|
||||
post_process =
|
||||
print_settings_id =
|
||||
raft_layers = 0
|
||||
resolution = 0
|
||||
seam_position = nearest
|
||||
single_extruder_multi_material_priming = 1
|
||||
skirts = 2
|
||||
@ -1170,7 +1168,6 @@ wipe_tower_rotation_angle = 0
|
||||
wipe_tower_bridging = 10
|
||||
interface_shells = 0
|
||||
bridge_flow_ratio = 0.8
|
||||
resolution = 0
|
||||
xy_size_compensation = 0
|
||||
elefant_foot_compensation = 0.2
|
||||
clip_multipart_objects = 1
|
||||
|
@ -1,8 +1,7 @@
|
||||
min_slic3r_version = 2.3.0-beta2
|
||||
0.0.3 Removed obsolete host keys.
|
||||
min_slic3r_version = 2.2.0-alpha3
|
||||
|
||||
0.0.5 General print quality improvements (??)0.0.4 superslicer: remove top_fan_speed
|
||||
0.0.5-susi remove resolution to use default
|
||||
0.0.5 General print quality improvements (??)
|
||||
0.0.4 superslicer: remove top_fan_speed
|
||||
0.0.3 slic3r++ adaptation: overlapping & top pattern.
|
||||
0.0.2 changed flow ratio from float to %
|
||||
0.0.1 Multiple Print models were unified into a single one.
|
||||
|
@ -5,7 +5,7 @@
|
||||
name = BIBO
|
||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||
config_version = 0.0.5
|
||||
config_version = 0.0.5-susi
|
||||
# Where to get the updates from?
|
||||
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/BIBO/
|
||||
|
||||
@ -79,7 +79,6 @@ perimeter_extrusion_width = 0.45
|
||||
post_process =
|
||||
print_settings_id =
|
||||
raft_layers = 0
|
||||
resolution = 0
|
||||
seam_position = aligned
|
||||
single_extruder_multi_material_priming = 0
|
||||
skirts = 3
|
||||
|
@ -5,7 +5,7 @@
|
||||
name = Custom
|
||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||
# This means, the server may force the Slic3r configuration to be downgraded.
|
||||
config_version = 0.1.3
|
||||
config_version = 0.1.4
|
||||
# Where to get the updates from?
|
||||
config_update_url =
|
||||
|
||||
@ -287,7 +287,6 @@ perimeter_extruder = 1
|
||||
post_process =
|
||||
print_settings_id =
|
||||
raft_layers = 0
|
||||
resolution = 0
|
||||
seam_position = hidden
|
||||
skirts = 0
|
||||
skirt_distance = 3
|
||||
|
@ -1,4 +1,5 @@
|
||||
min_slic3r_version = 2.3.0-beta2
|
||||
0.1.8-susi remove resolution to use default
|
||||
0.0.8 Slight end g-code improvements and spool weights.
|
||||
min_slic3r_version = 2.3.0-alpha2
|
||||
0.1.8 Fix G92 that mess up not-relative printer.
|
||||
|
@ -5,7 +5,7 @@
|
||||
name = Creality
|
||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||
config_version = 0.1.8
|
||||
config_version = 0.1.8-susi
|
||||
# Where to get the updates from?
|
||||
config_update_url =
|
||||
# https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/
|
||||
@ -219,7 +219,6 @@ perimeter_speed = 40
|
||||
post_process =
|
||||
print_settings_id =
|
||||
raft_layers = 0
|
||||
resolution = 0
|
||||
seam_position = near
|
||||
seam_travel_cost = 20%
|
||||
single_extruder_multi_material_priming = 1
|
||||
|
@ -1,4 +1,5 @@
|
||||
min_slic3r_version = 2.1.0
|
||||
0.0.3-susi remove resolution to use default
|
||||
0.0.3 slic3r++ adaptation: overlapping & top pattern.
|
||||
0.0.2 changed flow ratio from float to %
|
||||
0.0.1 Initial version
|
||||
|
@ -3,7 +3,7 @@
|
||||
[vendor]
|
||||
# Vendor name will be shown by the Config Wizard.
|
||||
name = LulzBot
|
||||
config_version = 0.0.3
|
||||
config_version = 0.0.3-susi
|
||||
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/LulzBot/
|
||||
|
||||
[printer_model:MINI_AERO]
|
||||
@ -81,7 +81,6 @@ perimeter_speed = 60
|
||||
perimeters = 3
|
||||
post_process =
|
||||
raft_layers = 0
|
||||
resolution = 0
|
||||
seam_position = hidden
|
||||
single_extruder_multi_material_priming = 1
|
||||
skirt_distance = 3
|
||||
@ -118,7 +117,7 @@ support_material_synchronize_layers = 0
|
||||
support_material_threshold = 0
|
||||
support_material_with_sheath = 1
|
||||
support_material_xy_spacing = 50%
|
||||
thin_perimeters = 0
|
||||
thin_perimeters = 1
|
||||
thin_walls = 1
|
||||
thin_walls_min_width = 50%
|
||||
thin_walls_overlap = 50%
|
||||
|
@ -1,4 +1,5 @@
|
||||
min_slic3r_version = 2.3.0-beta2
|
||||
1.2.0-susi remove resolution to use default
|
||||
1.2.0-beta1 Updated end g-code. Added full_fan_speed_layer values.
|
||||
min_slic3r_version = 2.3.0-beta0
|
||||
1.2.1-beta0 remove G92 in layer change, as it's not understand by the slicer.
|
||||
|
@ -9,7 +9,7 @@ technologies = FFF; SLA
|
||||
|
||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||
config_version = 1.2.0-beta1
|
||||
config_version = 1.2.0-susi
|
||||
# Where to get the updates from?
|
||||
config_update_url =
|
||||
changelog_url =
|
||||
@ -191,7 +191,6 @@ perimeter_extrusion_width = 0.45
|
||||
post_process =
|
||||
print_settings_id =
|
||||
raft_layers = 0
|
||||
resolution = 0
|
||||
seam_position = near
|
||||
seam_travel_cost = 20%
|
||||
single_extruder_multi_material_priming = 1
|
||||
|
@ -1,5 +1,5 @@
|
||||
min_slic3r_version = 2.3.0-alpha3
|
||||
|
||||
0.0.5-susi remove resolution to use default
|
||||
0.0.5 Removed obsolete host keys.0.0.4-1 remove g92
|
||||
0.0.4 Added PLA, PETG profiles for 0.8 nozzle, update print materials
|
||||
0.0.3 Added DeltiQ 2, DeltiQ 2 Plus printers, 0.10mm, 0.20mm FLEX print profiles, updated print materials, flexprint extension support
|
||||
|
@ -6,7 +6,7 @@
|
||||
name = TriLAB
|
||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||
config_version = 0.0.5
|
||||
config_version = 0.0.5-susi
|
||||
# Where to get the updates from?
|
||||
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/TriLAB/
|
||||
# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
|
||||
@ -160,7 +160,6 @@ perimeters = 2
|
||||
post_process =
|
||||
print_settings_id =
|
||||
raft_layers = 0
|
||||
resolution = 0
|
||||
seam_position = nearest
|
||||
single_extruder_multi_material_priming = 0
|
||||
skirt_distance = 3
|
||||
|
@ -1,4 +1,5 @@
|
||||
min_slic3r_version = 2.2.0
|
||||
0.0.5 remove resolution to use default, disable fan_mover
|
||||
0.0.4 2.3 adaptation (seam, thumbanils, ...)
|
||||
0.0.3 superslicer: remove top_fan_speed
|
||||
0.0.2 Update from DocJeeves settings, adding afterburner / mobius difference
|
||||
|
@ -5,7 +5,7 @@
|
||||
name = Voron
|
||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||
config_version = 0.0.4
|
||||
config_version = 0.0.5
|
||||
# Where to get the updates from?
|
||||
config_update_url =
|
||||
|
||||
@ -152,7 +152,6 @@ end_gcode = print_end ;end script from macro
|
||||
extruder_colour = #FFE3CA
|
||||
extruder_offset = 0x0
|
||||
gcode_flavor = klipper
|
||||
fan_speedup_time = 0
|
||||
layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z]
|
||||
machine_max_acceleration_e = 10000
|
||||
machine_max_acceleration_extruding = 1500
|
||||
@ -579,7 +578,6 @@ perimeter_speed = 100
|
||||
post_process =
|
||||
print_settings_id =
|
||||
raft_layers = 0
|
||||
resolution = 0
|
||||
seam_position = near
|
||||
seam_travel_cost = 20%
|
||||
single_extruder_multi_material_priming = 1
|
||||
@ -614,7 +612,7 @@ support_material_synchronize_layers = 0
|
||||
support_material_threshold = 30
|
||||
support_material_with_sheath = 0
|
||||
support_material_xy_spacing = 0.6
|
||||
thin_perimeters = 0
|
||||
thin_perimeters = 1
|
||||
thin_walls = 1
|
||||
thin_walls_min_width = 50%
|
||||
thin_walls_overlap = 50%
|
||||
|
@ -3151,7 +3151,7 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
|
||||
// extrude along the path
|
||||
std::string gcode;
|
||||
for (ExtrusionPaths::iterator path = paths.begin(); path != paths.end(); ++path) {
|
||||
path->simplify(SCALED_RESOLUTION);
|
||||
//path->simplify(SCALED_RESOLUTION); //should already be simplified
|
||||
gcode += this->_extrude(*path, description, speed);
|
||||
}
|
||||
|
||||
@ -3246,7 +3246,7 @@ std::string GCode::extrude_multi_path(const ExtrusionMultiPath &multipath, const
|
||||
// extrude along the path
|
||||
std::string gcode;
|
||||
for (ExtrusionPath path : multipath.paths) {
|
||||
path.simplify(SCALED_RESOLUTION);
|
||||
//path.simplify(SCALED_RESOLUTION); //should already be simplified
|
||||
gcode += this->_extrude(path, description, speed);
|
||||
}
|
||||
if (m_wipe.enable) {
|
||||
@ -3332,7 +3332,10 @@ std::string GCode::extrude_path(const ExtrusionPath &path, const std::string &de
|
||||
}
|
||||
m_last_too_small.polyline.points.clear();
|
||||
}
|
||||
simplifed_path.simplify(this->config().min_length.value != 0 ? scale_(this->config().min_length) : SCALED_RESOLUTION);
|
||||
if (this->config().min_length.value > 0) {
|
||||
simplifed_path.simplify(scale_(this->config().min_length));
|
||||
}
|
||||
//else simplifed_path.simplify(SCALED_RESOLUTION); //should already be simplified
|
||||
if (this->config().min_length.value != 0 && simplifed_path.length() < scale_(this->config().min_length)) {
|
||||
m_last_too_small = simplifed_path;
|
||||
return "";
|
||||
|
@ -108,14 +108,16 @@ namespace Slic3r {
|
||||
for (const Surface& surf : slices->surfaces) {
|
||||
ExPolygons surf_milling = offset_ex(surf.expolygon, milling_diameter/2, ClipperLib::jtRound);
|
||||
for (const ExPolygon& expoly : surf_milling)
|
||||
expoly.simplify(SCALED_RESOLUTION, &milling_lines);
|
||||
// expoly.simplify(SCALED_RESOLUTION, &milling_lines); // should already be done
|
||||
milling_lines.push_back(expoly);
|
||||
}
|
||||
milling_lines = union_ex(milling_lines);
|
||||
|
||||
ExPolygons secured_points = offset_ex(milling_lines, milling_diameter / 3);
|
||||
ExPolygons entrypoints;
|
||||
for (const ExPolygon& expoly : secured_points)
|
||||
expoly.simplify(SCALED_RESOLUTION, &entrypoints);
|
||||
// expoly.simplify(SCALED_RESOLUTION, &entrypoints); // should already be done
|
||||
entrypoints.push_back(expoly);
|
||||
entrypoints = union_ex(entrypoints);
|
||||
Polygons entrypoints_poly;
|
||||
for (const ExPolygon& expoly : secured_points)
|
||||
@ -150,7 +152,8 @@ namespace Slic3r {
|
||||
for (const Surface& surf : slices->surfaces) {
|
||||
ExPolygons surf_milling = offset_ex(surf.expolygon, milling_radius, ClipperLib::jtRound);
|
||||
for (const ExPolygon& expoly : surf_milling)
|
||||
expoly.simplify(SCALED_RESOLUTION, &milling_lines);
|
||||
// expoly.simplify(SCALED_RESOLUTION, &milling_lines); // should already be done
|
||||
milling_lines.push_back(expoly);
|
||||
surfaces.push_back(surf.expolygon);
|
||||
}
|
||||
union_ex(milling_lines, true);
|
||||
@ -166,7 +169,8 @@ namespace Slic3r {
|
||||
ExPolygons safe_umillable = diff_ex(offset_ex(exact_unmillable_area, safety_offset), surfaces, true);
|
||||
ExPolygons safe_umillable_simplified;
|
||||
for (const ExPolygon& expoly : safe_umillable)
|
||||
expoly.simplify(SCALED_RESOLUTION, &safe_umillable_simplified);
|
||||
// expoly.simplify(SCALED_RESOLUTION, &safe_umillable_simplified); // should already be done
|
||||
safe_umillable_simplified.push_back(expoly);
|
||||
return union_ex(safe_umillable_simplified, true);
|
||||
}
|
||||
|
||||
|
@ -332,7 +332,9 @@ void PerimeterGenerator::process()
|
||||
//this var store infill surface removed from last to not add any more perimeters to it.
|
||||
ExPolygons top_fills;
|
||||
ExPolygons fill_clip;
|
||||
ExPolygons last = union_ex(surface.expolygon.simplify_p(SCALED_RESOLUTION));
|
||||
// simplification already done at slicing
|
||||
//ExPolygons last = union_ex(surface.expolygon.simplify_p(SCALED_RESOLUTION));
|
||||
ExPolygons last = union_ex(surface.expolygon);
|
||||
|
||||
if (loop_number >= 0) {
|
||||
|
||||
|
@ -2642,13 +2642,13 @@ void PrintConfigDef::init_fff_params()
|
||||
def->label = L("'As bridge' speed threshold");
|
||||
def->full_label = L("Overhang bridge speed threshold");
|
||||
def->category = OptionCategory::perimeter;
|
||||
def->tooltip = L("Minimum unsupported width for an extrusion to apply the bridge speed & fan to this overhang."
|
||||
def->tooltip = L("Minimum unsupported width for an extrusion to apply the bridge fan & overhang speed to this overhang."
|
||||
" Can be in mm or in a % of the nozzle diameter."
|
||||
" Set to 0 to deactivate.");
|
||||
def->ratio_over = "nozzle_diameter";
|
||||
def->min = 0;
|
||||
def->mode = comExpert;
|
||||
def->set_default_value(new ConfigOptionFloatOrPercent(50,true));
|
||||
def->set_default_value(new ConfigOptionFloatOrPercent(55,true));
|
||||
|
||||
def = this->add("overhangs_width", coFloatOrPercent);
|
||||
def->label = L("'As bridge' flow threshold");
|
||||
@ -2860,11 +2860,12 @@ void PrintConfigDef::init_fff_params()
|
||||
"the slicing job and reducing memory usage. High-resolution models often carry "
|
||||
"more detail than printers can render. Set to zero to disable any simplification "
|
||||
"and use full resolution from input. "
|
||||
"\nNote: slic3r simplify the geometry with a treshold of 0.0125mm and has an internal resolution of 0.0001mm.");
|
||||
"\nNote: SuperSlicer has an internal resolution of 0.000001mm."
|
||||
"\nInfill & Thin areas are simplified up to 0.0125mm.");
|
||||
def->sidetext = L("mm");
|
||||
def->min = 0;
|
||||
def->mode = comExpert;
|
||||
def->set_default_value(new ConfigOptionFloat(0));
|
||||
def->set_default_value(new ConfigOptionFloat(0.0125));
|
||||
|
||||
def = this->add("retract_before_travel", coFloats);
|
||||
def->label = L("Minimum travel after retraction");
|
||||
|
@ -126,8 +126,8 @@ void PrintObject::slice()
|
||||
if (! warning.empty())
|
||||
BOOST_LOG_TRIVIAL(info) << warning;
|
||||
// Simplify slices if required.
|
||||
if (m_print->config().resolution)
|
||||
this->simplify_slices(scale_(this->print()->config().resolution));
|
||||
if (m_print->config().resolution.value > 0)
|
||||
this->simplify_slices(scale_(this->print()->config().resolution.value));
|
||||
|
||||
//create polyholes
|
||||
this->_transform_hole_to_polyholes();
|
||||
@ -2455,7 +2455,7 @@ void PrintObject::_slice(const std::vector<coordf_t> &layer_height_profile)
|
||||
BOOST_LOG_TRIVIAL(debug) << "Slicing modifier volumes - stealing " << region_id << " end";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - removing top empty layers";
|
||||
while (! m_layers.empty()) {
|
||||
const Layer *layer = m_layers.back();
|
||||
@ -2771,7 +2771,7 @@ ExPolygons PrintObject::_smooth_curves(const ExPolygons & input, const PrintRegi
|
||||
ExPolygons new_polys;
|
||||
for (const ExPolygon &ex_poly : input) {
|
||||
ExPolygon new_ex_poly(ex_poly);
|
||||
new_ex_poly.contour.remove_collinear(SCALED_RESOLUTION);
|
||||
new_ex_poly.contour.remove_collinear(SCALED_EPSILON * 10);
|
||||
new_ex_poly.contour = _smooth_curve(new_ex_poly.contour, PI,
|
||||
conf.curve_smoothing_angle_convex.value*PI / 180.0,
|
||||
conf.curve_smoothing_angle_concave.value*PI / 180.0,
|
||||
@ -2779,7 +2779,7 @@ ExPolygons PrintObject::_smooth_curves(const ExPolygons & input, const PrintRegi
|
||||
scale_(conf.curve_smoothing_precision.value));
|
||||
for (Polygon &phole : new_ex_poly.holes){
|
||||
phole.reverse(); // make_counter_clockwise();
|
||||
phole.remove_collinear(SCALED_RESOLUTION);
|
||||
phole.remove_collinear(SCALED_EPSILON * 10);
|
||||
phole = _smooth_curve(phole, PI,
|
||||
conf.curve_smoothing_angle_convex.value*PI / 180.0,
|
||||
conf.curve_smoothing_angle_concave.value*PI / 180.0,
|
||||
|
@ -1767,7 +1767,7 @@ void TriangleMeshSlicer::make_expolygons(const Polygons &loops, ExPolygons* slic
|
||||
// p_slices = diff(p_slices, *loop);
|
||||
//}
|
||||
|
||||
//remove point in the same plane (have to do that before the safety offset to avoid workgin on a distored polygon)
|
||||
//remove point in the same plane (have to do that before the safety offset to avoid working on a distored polygon)
|
||||
Polygons filered_polys = loops;
|
||||
if (this->model_precision > 0){
|
||||
for (Polygon &hole : filered_polys){
|
||||
|
@ -31,7 +31,7 @@
|
||||
using coord_t = int32_t;
|
||||
#else
|
||||
//FIXME At least FillRectilinear2 and std::boost Voronoi require coord_t to be 32bit.
|
||||
typedef int64_t coord_t;
|
||||
using coord_t = int64_t;
|
||||
#endif
|
||||
|
||||
using coordf_t = double;
|
||||
@ -47,9 +47,13 @@ static constexpr double EPSILON = 1e-4;
|
||||
// int32_t fits an interval of (-2147.48mm, +2147.48mm)
|
||||
// with int64_t we don't have to worry anymore about the size of the int.
|
||||
static constexpr double SCALING_FACTOR = 0.000001;
|
||||
static constexpr double UNSCALING_FACTOR = 1 / SCALING_FACTOR;
|
||||
// RESOLUTION, SCALED_RESOLUTION: Used as an error threshold for a Douglas-Peucker polyline simplification algorithm.
|
||||
#define RESOLUTION 0.0125
|
||||
#define SCALED_RESOLUTION (RESOLUTION / SCALING_FACTOR)
|
||||
//#define RESOLUTION 0.0125
|
||||
//#define SCALED_RESOLUTION 12500
|
||||
//#define SCALED_RESOLUTION (RESOLUTION / SCALING_FACTOR)
|
||||
static constexpr coordf_t RESOLUTION = 0.0125;
|
||||
static constexpr coord_t SCALED_RESOLUTION = 0.0125 * UNSCALING_FACTOR;
|
||||
//for creating circles (for brim_ear)
|
||||
#define POLY_SIDES 24
|
||||
#define PI 3.141592653589793238
|
||||
@ -92,9 +96,9 @@ inline T unscale(Q v) { return T(v) * T(SCALING_FACTOR); }
|
||||
|
||||
inline double unscaled(double v) { return v * SCALING_FACTOR; }
|
||||
inline coordf_t unscale_(coord_t v) { return v * SCALING_FACTOR; }
|
||||
inline coord_t scale_t(coordf_t v) { return (coord_t)(v / SCALING_FACTOR); }
|
||||
inline double scale_d(coordf_t v) { return (v / SCALING_FACTOR); }
|
||||
inline double scale_d(coord_t v) { return ((double)v / SCALING_FACTOR); }
|
||||
inline coord_t scale_t(coordf_t v) { return (coord_t)(v * UNSCALING_FACTOR); }
|
||||
inline double scale_d(coordf_t v) { return (v * UNSCALING_FACTOR); }
|
||||
inline double scale_d(coord_t v) { return (double(v) * UNSCALING_FACTOR); }
|
||||
|
||||
enum Axis {
|
||||
X=0,
|
||||
|
Loading…
x
Reference in New Issue
Block a user