# Comment blocks of the openscad files compiled into this engine build, verbatim.
# Each block is quoted exactly from the named source (an asset A member, or a file of the hosted
# run's evidence) at the named lines; its sha256 is of the quoted bytes. "also in" names further
# locations whose block has the same text after whitespace normalisation. See METHOD.md.
# This is a notice inventory, not legal advice.

==== sources/openscad/src/Cache.h lines 1-43 sha256 7c7c95b087ea02363ac51687749f32f40eaa40b456fa2745ceb2e66e4d0230d8 ====
/****************************************************************************
**
** OpenSCAD (www.openscad.org)
** Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and
**                         Marius Kintel <marius@kintel.net>
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial Usage
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights.  These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$
**
****************************************************************************/

==== sources/openscad/src/FontCache.cc lines 1-25 sha256 44cf30fe43b1fa881e93ea174473db8f80464ed37f76d57117d4786346cdf160 ====
also in: sources/openscad/src/FontCache.h:1-25, sources/openscad/src/core/Arguments.cc:1-25, sources/openscad/src/core/CSGNode.cc:1-25, sources/openscad/src/core/CgalAdvNode.cc:1-25, sources/openscad/src/core/Children.cc:1-25, sources/openscad/src/core/ColorNode.cc:1-25, sources/openscad/src/core/Context.cc:1-25, sources/openscad/src/core/ContextFrame.cc:1-25, sources/openscad/src/core/ContextMemoryManager.cc:1-25, sources/openscad/src/core/CsgOpNode.cc:1-25, sources/openscad/src/core/DrawingCallback.cc:1-25, sources/openscad/src/core/DrawingCallback.h:1-25, sources/openscad/src/core/EvaluationSession.cc:1-25, sources/openscad/src/core/Expression.cc:1-25, sources/openscad/src/core/FreetypeRenderer.cc:1-25, sources/openscad/src/core/FreetypeRenderer.h:1-25, sources/openscad/src/core/GroupModule.cc:1-25, sources/openscad/src/core/ImportNode.cc:1-25, sources/openscad/src/core/LinearExtrudeNode.cc:1-25, sources/openscad/src/core/OffsetNode.cc:1-25, sources/openscad/src/core/Parameters.cc:1-25, sources/openscad/src/core/ProjectionNode.cc:1-25, sources/openscad/src/core/RenderNode.cc:1-25, sources/openscad/src/core/RotateExtrudeNode.cc:1-25, sources/openscad/src/core/Selection.h:1-25, sources/openscad/src/core/SourceFile.cc:1-25, sources/openscad/src/core/StatCache.cc:1-25, sources/openscad/src/core/StatCache.h:1-25, sources/openscad/src/core/SurfaceNode.cc:1-25, sources/openscad/src/core/SurfaceNode.h:1-25, sources/openscad/src/core/TextNode.cc:1-25, sources/openscad/src/core/TransformNode.cc:1-25, sources/openscad/src/core/UserModule.cc:1-25, sources/openscad/src/core/Value.cc:1-25, sources/openscad/src/core/builtin_functions.cc:1-25, sources/openscad/src/core/control.cc:1-25, sources/openscad/src/core/customizer/Annotation.cc:1-25, sources/openscad/src/core/function.cc:1-25, sources/openscad/src/core/lexer.l:1-25, sources/openscad/src/core/module.cc:1-25, sources/openscad/src/core/node.cc:1-25, sources/openscad/src/core/node_clone.cc:1-25, sources/openscad/src/core/parser.y:1-25, sources/openscad/src/core/primitives.cc:1-25, sources/openscad/src/core/primitives.h:1-25, sources/openscad/src/geometry/PolySet.cc:1-25, sources/openscad/src/geometry/PolySetBuilder.cc:1-25, sources/openscad/src/io/DxfData.cc:1-25, sources/openscad/src/io/dxfdim.cc:1-25, sources/openscad/src/io/export.cc:1-25, sources/openscad/src/io/export_amf.cc:1-25, sources/openscad/src/io/export_dxf.cc:1-25, sources/openscad/src/io/export_nef.cc:1-25, sources/openscad/src/io/export_stl.cc:1-25, sources/openscad/src/io/export_svg.cc:1-25, sources/openscad/src/io/import_amf.cc:1-25, sources/openscad/src/openscad.cc:1-25, sources/openscad/src/openscad.h:1-25, sources/openscad/src/openscad_gui.h:1-25, sources/openscad/src/utils/calc.cc:1-25, sources/openscad/src/utils/degree_trig.cc:1-25, sources/openscad/src/utils/degree_trig.h:1-25
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and
 *                          Marius Kintel <marius@kintel.net>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/RenderStatistic.cc lines 1-24 sha256 73fd6a2574bba173c3960fb4d04958a01ae2afca9cf9a06487209d2789db6f66 ====
also in: sources/openscad/src/RenderStatistic.h:1-24
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2020 Golubev Alexander <fatzer2@gmail.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/core/Assignment.cc lines 1-25 sha256 dbfd8439ef1abbeafe2c0845c1c68369a0ae3ad58e4b7b74cf73da5132dd094e ====
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and
 *                          Marius Kintel <marius@kintel.net>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *  This program is distributed in the hope that it will be useful,
 *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/core/RoofNode.cc lines 1-2 sha256 5dda65b20c32ae137a2ce13fa7dd80e081f7a20d15c616a7e5ab744dfe95aa7d ====
also in: sources/openscad/src/core/RoofNode.h:1-2, sources/openscad/src/geometry/roof_ss.cc:1-2, sources/openscad/src/geometry/roof_ss.h:1-2, sources/openscad/src/geometry/roof_vd.cc:1-2, sources/openscad/src/geometry/roof_vd.h:1-2
// This file is a part of openscad. Everything implied is implied.
// Author: Alexey Korepanov <kaikaikai@yandex.ru>

==== sources/openscad/src/core/XkcdColors.h lines 9-21 sha256 e3bf62f1619d518f526a2d0acf48ab85e94bdd9abfc00b2a992e875d1628785c ====
/*
 *  https://xkcd.com/color/rgb/ - The 954 most common RGB monitor
 *  colors, as defined by several hundred thousand participants in
 *  the xkcd color name survey.
 *
 *  Retrieved from https://xkcd.com/color/rgb.txt on 2025-08-31.
 *  License: https://creativecommons.org/publicdomain/zero/1.0/
 *
 *  Blog posts:
 *  - https://blog.xkcd.com/2010/03/01/color-name-survey/
 *  - https://blog.xkcd.com/2010/05/03/color-survey-results/
 *  - https://blog.xkcd.com/2010/05/06/sex-and-gender/
 */

==== sources/openscad/src/ext/CGAL/CGAL_workaround_Mark_bounded_volumes.h lines 1-19 sha256 43dda7a1f03ab935df5c96d463b8699fda09ee46c41348ea84c8c87ae38bfb31 ====
// Copyright (c) 2005  Max-Planck-Institute Saarbruecken (Germany).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
// You can redistribute it and/or modify it under the terms of the GNU
// General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
//
// Licensees holding a valid commercial license may use this file in
// accordance with the commercial license agreement provided with the software.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// $URL 
// $Id$ 
// 
//
// Author(s)     : Ralf Osbild <osbild@mpi-sb.mpg.de>

==== sources/openscad/src/ext/CGAL/CGAL_workaround_Mark_bounded_volumes.h lines 21-22 sha256 54d85e106a7530eb605335935f57539e58b2e03c964ed4b80a46b697a17ff9a8 ====
// Rewritten by Oskar Linde <oskar.linde@gmail.com>
// Now marks volumes recursively with alternating marks

==== sources/openscad/src/ext/glad/egl.h lines 1-27 sha256 bf59b2ed0d89ffb4346d2556bff27551ad7e9fc86f79d6b094802d648d82462e ====
/**
 * Loader generated by glad 2.0.4 on Mon Sep 25 10:54:26 2023
 *
 * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0
 *
 * Generator: C/C++
 * Specification: egl
 * Extensions: 9
 *
 * APIs:
 *  - egl=1.5
 *
 * Options:
 *  - ALIAS = True
 *  - DEBUG = False
 *  - HEADER_ONLY = True
 *  - LOADER = True
 *  - MX = False
 *  - ON_DEMAND = False
 *
 * Commandline:
 *    --merge --api='egl=1.5' --extensions='EGL_EXT_device_base,EGL_EXT_device_enumeration,EGL_EXT_platform_base,EGL_EXT_platform_device,EGL_KHR_cl_event2,EGL_KHR_fence_sync,EGL_KHR_image,EGL_KHR_image_base,EGL_KHR_reusable_sync' c --alias --header-only --loader
 *
 * Online:
 *    http://glad.sh/#api=egl%3D1.5&extensions=EGL_EXT_device_base%2CEGL_EXT_device_enumeration%2CEGL_EXT_platform_base%2CEGL_EXT_platform_device%2CEGL_KHR_cl_event2%2CEGL_KHR_fence_sync%2CEGL_KHR_image%2CEGL_KHR_image_base%2CEGL_KHR_reusable_sync&generator=c&options=MERGE%2CALIAS%2CHEADER_ONLY%2CLOADER
 *
 */

==== sources/openscad/src/ext/glad/egl.h lines 351-372 sha256 438187dca092de4032c1a16524aa4c34c71a0f985a71251a675aad54e77ed561 ====
also in: sources/openscad/src/ext/glad/gl.h:3355-3376
/*
** Copyright (c) 2008-2018 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are 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 Materials.
**
** THE MATERIALS ARE 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
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/

==== sources/openscad/src/ext/glad/egl.h lines 662-665 sha256 f2c9d0f0439ff7ed39eeb730f319d85fcbbf7637436e3aeacc433d09facf4098 ====
/*
** Copyright 2007-2020 The Khronos Group Inc.
** SPDX-License-Identifier: Apache-2.0
*/

==== sources/openscad/src/ext/glad/egl.h lines 1126-1128 sha256 65646da8cf933a288e657440dd6750d6535a1cd3e373844cd5091f85424e1309 ====
also in: sources/openscad/src/ext/glad/gl.h:10195-10197
/**
 * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0
 */

==== sources/openscad/src/ext/glad/gl.h lines 1-28 sha256 e6fbbf528359eb4540a4a1df8c4f6195c838e7fae02cbf11b1694059344d2e0d ====
/**
 * Loader generated by glad 2.0.4 on Mon Sep 25 10:54:26 2023
 *
 * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0
 *
 * Generator: C/C++
 * Specification: gl
 * Extensions: 175
 *
 * APIs:
 *  - gl:compatibility=4.6
 *  - gles2=3.2
 *
 * Options:
 *  - ALIAS = True
 *  - DEBUG = False
 *  - HEADER_ONLY = True
 *  - LOADER = True
 *  - MX = False
 *  - ON_DEMAND = False
 *
 * Commandline:
 *    --merge --api='gl:compatibility=4.6,gles2=3.2' --extensions='GL_AMD_draw_buffers_blend,GL_AMD_multi_draw_indirect,GL_APPLE_flush_buffer_range,GL_APPLE_vertex_array_object,GL_ARB_ES2_compatibility,GL_ARB_ES3_1_compatibility,GL_ARB_base_instance,GL_ARB_blend_func_extended,GL_ARB_buffer_storage,GL_ARB_clear_buffer_object,GL_ARB_clear_texture,GL_ARB_clip_control,GL_ARB_color_buffer_float,GL_ARB_compute_shader,GL_ARB_copy_buffer,GL_ARB_copy_image,GL_ARB_debug_output,GL_ARB_direct_state_access,GL_ARB_draw_buffers,GL_ARB_draw_buffers_blend,GL_ARB_draw_elements_base_vertex,GL_ARB_draw_indirect,GL_ARB_draw_instanced,GL_ARB_framebuffer_no_attachments,GL_ARB_framebuffer_object,GL_ARB_geometry_shader4,GL_ARB_get_program_binary,GL_ARB_get_texture_sub_image,GL_ARB_gl_spirv,GL_ARB_gpu_shader_fp64,GL_ARB_imaging,GL_ARB_indirect_parameters,GL_ARB_instanced_arrays,GL_ARB_internalformat_query,GL_ARB_internalformat_query2,GL_ARB_invalidate_subdata,GL_ARB_map_buffer_range,GL_ARB_multi_bind,GL_ARB_multi_draw_indirect,GL_ARB_multisample,GL_ARB_multitexture,GL_ARB_occlusion_query,GL_ARB_occlusion_query2,GL_ARB_point_parameters,GL_ARB_polygon_offset_clamp,GL_ARB_program_interface_query,GL_ARB_provoking_vertex,GL_ARB_robustness,GL_ARB_sample_shading,GL_ARB_sampler_objects,GL_ARB_separate_shader_objects,GL_ARB_shader_atomic_counters,GL_ARB_shader_image_load_store,GL_ARB_shader_objects,GL_ARB_shader_storage_buffer_object,GL_ARB_shader_subroutine,GL_ARB_sync,GL_ARB_tessellation_shader,GL_ARB_texture_barrier,GL_ARB_texture_buffer_object,GL_ARB_texture_buffer_range,GL_ARB_texture_compression,GL_ARB_texture_cube_map,GL_ARB_texture_env_dot3,GL_ARB_texture_multisample,GL_ARB_texture_storage,GL_ARB_texture_storage_multisample,GL_ARB_texture_view,GL_ARB_timer_query,GL_ARB_transform_feedback2,GL_ARB_transform_feedback3,GL_ARB_transform_feedback_instanced,GL_ARB_transpose_matrix,GL_ARB_uniform_buffer_object,GL_ARB_vertex_array_object,GL_ARB_vertex_attrib_64bit,GL_ARB_vertex_attrib_binding,GL_ARB_vertex_buffer_object,GL_ARB_vertex_program,GL_ARB_vertex_shader,GL_ARB_vertex_type_2_10_10_10_rev,GL_ARB_viewport_array,GL_ARB_window_pos,GL_ATI_draw_buffers,GL_ATI_separate_stencil,GL_EXT_blend_color,GL_EXT_blend_equation_separate,GL_EXT_blend_func_separate,GL_EXT_blend_minmax,GL_EXT_copy_texture,GL_EXT_depth_bounds_test,GL_EXT_direct_state_access,GL_EXT_draw_buffers2,GL_EXT_draw_instanced,GL_EXT_draw_range_elements,GL_EXT_fog_coord,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_EXT_geometry_shader4,GL_EXT_gpu_shader4,GL_EXT_multi_draw_arrays,GL_EXT_packed_depth_stencil,GL_EXT_point_parameters,GL_EXT_polygon_offset_clamp,GL_EXT_provoking_vertex,GL_EXT_secondary_color,GL_EXT_shader_image_load_store,GL_EXT_subtexture,GL_EXT_texture3D,GL_EXT_texture_array,GL_EXT_texture_buffer_object,GL_EXT_texture_integer,GL_EXT_texture_object,GL_EXT_texture_storage,GL_EXT_timer_query,GL_EXT_transform_feedback,GL_EXT_vertex_array,GL_EXT_vertex_attrib_64bit,GL_INGR_blend_func_separate,GL_KHR_debug,GL_KHR_robustness,GL_MESA_window_pos,GL_NVX_conditional_render,GL_NV_conditional_render,GL_NV_explicit_multisample,GL_NV_geometry_program4,GL_NV_occlusion_query,GL_NV_point_sprite,GL_NV_transform_feedback,GL_NV_transform_feedback2,GL_NV_vertex_program,GL_NV_vertex_program4,GL_OES_single_precision,GL_SGIS_point_parameters,GL_ANGLE_instanced_arrays,GL_APPLE_sync,GL_EXT_copy_image,GL_EXT_disjoint_timer_query,GL_EXT_draw_buffers,GL_EXT_draw_buffers_indexed,GL_EXT_draw_elements_base_vertex,GL_EXT_geometry_shader,GL_EXT_instanced_arrays,GL_EXT_map_buffer_range,GL_EXT_multisampled_render_to_texture,GL_EXT_primitive_bounding_box,GL_EXT_robustness,GL_EXT_separate_shader_objects,GL_EXT_tessellation_shader,GL_EXT_texture_border_clamp,GL_EXT_texture_buffer,GL_KHR_blend_equation_advanced,GL_NV_blend_equation_advanced,GL_NV_copy_buffer,GL_NV_draw_instanced,GL_NV_framebuffer_blit,GL_NV_framebuffer_multisample,GL_NV_instanced_arrays,GL_NV_non_square_matrices,GL_NV_viewport_array,GL_OES_copy_image,GL_OES_draw_buffers_indexed,GL_OES_draw_elements_base_vertex,GL_OES_geometry_shader,GL_OES_get_program_binary,GL_OES_mapbuffer,GL_OES_primitive_bounding_box,GL_OES_sample_shading,GL_OES_tessellation_shader,GL_OES_texture_border_clamp,GL_OES_texture_buffer,GL_OES_texture_storage_multisample_2d_array,GL_OES_vertex_array_object,GL_OES_viewport_array' c --alias --header-only --loader
 *
 * Online:
 *    http://glad.sh/#api=gl%3Acompatibility%3D4.6%2Cgles2%3D3.2&generator=c&options=MERGE%2CALIAS%2CHEADER_ONLY%2CLOADER
 *
 */

==== sources/openscad/src/ext/json/json.hpp lines 1-7 sha256 375139b70f0e178eabf486fbe2f2169e4cb4c283dc28ec1cfd24e2627a8a6fff ====
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 9-16 sha256 f9a36ae32a5e221fc05c2e550ea4f66e5fb295a04d823d723a2d269ea0424aef ====
/****************************************************************************\
 * Note on documentation: The source files contain links to the online      *
 * documentation of the public API at https://json.nlohmann.me. This URL    *
 * contains the most recent documentation and should also be applicable to  *
 * previous versions; documentation for deprecated functions is not         *
 * removed, but marked deprecated. See "Generate documentation" section in  *
 * file docs/README.md.                                                     *
\****************************************************************************/

==== sources/openscad/src/ext/json/json.hpp lines 34-41 sha256 a9f04387acc3ce31f4180fef87feeccb2d44fb0544bf6ba6d814a5804c6e9b08 ====
// #include <nlohmann/adl_serializer.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 47-54 sha256 12f43745b7c0d98f777c5f1f1bfc6a0e2e49e405d02a0009f47d1401fa82a3e2 ====
// #include <nlohmann/detail/abi_macros.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 160-167 sha256 7bde2d4badadedf18ee432f85d79efba828a90aa8c8f615820a1141e0e064ee6 ====
// #include <nlohmann/detail/conversions/from_json.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 183-190 sha256 ca518e5bec7c5e1db3156be45f4d604e0efbc96e4d2da4b611d4826296ca8a78 ====
// #include <nlohmann/detail/exceptions.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 203-210 sha256 dba4605b820bcdfcf1e5d78396656f99509254c9d437afef761f61c565f1e723 ====
// #include <nlohmann/detail/value_t.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 219-226 sha256 05009754693f89c835eac2d24cc95084d4533b32a1d8f598915c723278193cfe ====
// #include <nlohmann/detail/macro_scope.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 231-238 sha256 1d067bc29db46a573077968a38fef120f921aaf2a47b851693bfaac2d0db48dc ====
// #include <nlohmann/detail/meta/detected.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 244-251 sha256 e393040988b155d7a5fc3b0877e9f873e8b8124047e0b69624555e9a89232f62 ====
// #include <nlohmann/detail/meta/void_t.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 332-339 sha256 606003adea684cbae6deb0cc907a7b078ff229cd70a993d93388a38eb00c6a6b ====
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-FileCopyrightText: 2016 - 2021 Evan Nemerson <evan@nemerson.com>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 3069-3076 sha256 01f2c8bdfe2442aa29a9d43755691b546fa6a5ba5d2c592cb2af255852db8036 ====
// #include <nlohmann/detail/string_escape.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 3144-3151 sha256 c3691f6f1c2ee72640fd240e7620c78b2dadd48c40b9d3b0ef5519967257a39d ====
// #include <nlohmann/detail/input/position_t.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 3186-3194 sha256 53ccb8737a9de5e93aa8e934acfc5b1d16a1feecf75c77658d82da95e9787e63 ====
// #include <nlohmann/detail/meta/cpp_future.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-FileCopyrightText: 2018 The Abseil Authors
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 3227-3228 sha256 adc3a4f769b5ea9ad918221448a117cc77d83406743b338e59928268e23ab062 ====
// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h
// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0.

==== sources/openscad/src/ext/json/json.hpp lines 3360-3367 sha256 55e4643eed2c50d60e6669689e54c804520015709b3fdc75deb856b5397b206e ====
// #include <nlohmann/detail/meta/type_traits.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 3379-3386 sha256 e0d196ade5d5ab4cc77fd038a8a0747d0c9d9714e5e2deacb059f403b19d6fee ====
// #include <nlohmann/detail/iterators/iterator_traits.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 3447-3454 sha256 9d4ccbc720cdba29818d0e8877c9640685da9e2699e5b1c0e2675b5478d03472 ====
// #include <nlohmann/detail/meta/call_std/begin.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 3467-3474 sha256 f1f7929a98d92dc5baf185ced79d15809440e016c54d99ecd1e2680d222aac69 ====
// #include <nlohmann/detail/meta/call_std/end.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 3491-3498 sha256 e2f6a96ba1875c306113c29b7b79dc74fec40cee6b23aa70286bee6bc611dab6 ====
// #include <nlohmann/json_fwd.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 4366-4373 sha256 14b9f41393fb6eccb04b88150a8194c17d42548063406664dc3b16366450f119 ====
// #include <nlohmann/detail/string_concat.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 4786-4793 sha256 39d6a65d834033b2107b881aaa5d01a3ec09545178375ddc7f0d134d11bf03d7 ====
// #include <nlohmann/detail/meta/identity_tag.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 4810-4817 sha256 4859efa4cdd4838b9d6b1e343593c77a8d122112d885deff0fb50c1e00304fb9 ====
// #include <nlohmann/detail/meta/std_fs.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 5402-5409 sha256 af86bec71f076f86093d3aa4bdd52f24982e03e95b1d6cc363ebeb8a4664c421 ====
// #include <nlohmann/detail/conversions/to_json.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 5429-5436 sha256 ce33c462235c367c7802728d3f629b76673c84bac1c344fe5c85fcd95ea74a41 ====
// #include <nlohmann/detail/iterators/iteration_proxy.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 5453-5460 sha256 d0da861b857c728d85082b09f8063e419ee04b7b058a7d62b23ffe8dd1d7cb9e ====
// #include <nlohmann/detail/string_utils.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 6215-6222 sha256 eef92319424d83de8e8d0fc42a252f06e3bff39720e4ef55572692752b85c288 ====
// #include <nlohmann/byte_container_with_subtype.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 6327-6334 sha256 5b3f1cb2f9d83cd0c24b8637c865e1813b3e0014b58ed19efd68f10423beba4c ====
// #include <nlohmann/detail/hash.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 6460-6467 sha256 cb7d21119d445c223aebbf5b47a100f05935db4b7ee30d99bb48ad49b531cc9f ====
// #include <nlohmann/detail/input/binary_reader.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 6489-6496 sha256 502f894a10150d677b7396ae2d390e867640b8ac29b8cd69436c4392ce4b0b7f ====
// #include <nlohmann/detail/input/input_adapters.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 7045-7052 sha256 35c593bfcb6f023e34ac9eb62c98e54303347e3942dbfe36a77c11fb6d2c4435 ====
// #include <nlohmann/detail/input/json_sax.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 7064-7071 sha256 4ca7194240da4170424cd754535762c742e7563c4ae0aed09bead9cc745aa3de ====
// #include <nlohmann/detail/input/lexer.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 9688-9695 sha256 ad2e2ce003a21f42557d084f5dd862c5c906a3ffc3ef9ffb5a9ec54e6fa11191 ====
// #include <nlohmann/detail/meta/is_sax.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 12909-12916 sha256 7da892917bfde8fd4f047c532d01da4ef2c1c4d044a907dd0fe8a96239aa7dbc ====
// #include <nlohmann/detail/input/parser.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 13455-13462 sha256 9ecf2d083d46f796e72bde51e1d771bcec5f0818380c2d8c743f1397a5b198fe ====
// #include <nlohmann/detail/iterators/internal_iterator.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 13468-13475 sha256 015ab856db76eef66f8931b699dbcf44608d4710ca02c67904e2e248080ace3e ====
// #include <nlohmann/detail/iterators/primitive_iterator.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 13627-13634 sha256 9882c4902682ca68553e8010574445ebe8419c118f261f2ac4655949381eb794 ====
// #include <nlohmann/detail/iterators/iter_impl.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 14398-14405 sha256 a82f0f9976d82e2ed7fd8a2196528a2546c125fffe93b8c278b52c76655c088e ====
// #include <nlohmann/detail/iterators/json_reverse_iterator.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 14533-14540 sha256 d47a81748e93cf37eeba72d89c07a23452c9f2e9a95d260a9dc401c25e0422de ====
// #include <nlohmann/detail/json_custom_base_class.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 14575-14582 sha256 0bb555a785b183f31799370176bb035b2f97ce7dd2dbdae570f953ed73d9ac0f ====
// #include <nlohmann/detail/json_pointer.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 15570-15577 sha256 bba3ce984fad28838c9b780a71cd48df3b9ec8fce3d7fe93d3d2da4499813705 ====
// #include <nlohmann/detail/json_ref.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 15664-15671 sha256 7a6927494fa9ed1fc583786976e68e03c5d0255d27d80fc696c7973ec4cde5a4 ====
// #include <nlohmann/detail/output/binary_writer.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 15690-15697 sha256 eb4ee2bb9c5e22b3d5143caef28dac3126adc9aad29939864b6a190eca24a698 ====
// #include <nlohmann/detail/output/output_adapters.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 17683-17691 sha256 1b3334de27eb02ea486e7fb696ae98031ef0f35b87cd676ce5791428963929ce ====
// #include <nlohmann/detail/output/serializer.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2008 - 2009 Björn Hoehrmann <bjoern@hoehrmann.de>
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 17708-17716 sha256 8c65b95da918b4a53b9e60bd304635a7a9c44b33099e67cb53bd6d5e7ed0b700 ====
// #include <nlohmann/detail/conversions/to_chars.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2009 Florian Loitsch <https://florian.loitsch.com/>
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 17734-17752 sha256 309b65be78231dcddb3e65942dbcc066bf5339ce84b870c6f31bbe2ad3754021 ====
/*!
@brief implements the Grisu2 algorithm for binary to decimal floating-point
conversion.

This implementation is a slightly modified version of the reference
implementation which may be obtained from
http://florian.loitsch.com/publications (bench.tar.gz).

The code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch.

For a detailed description of the algorithm see:

[1] Loitsch, "Printing Floating-Point Numbers Quickly and Accurately with
    Integers", Proceedings of the ACM SIGPLAN 2010 Conference on Programming
    Language Design and Implementation, PLDI 2010
[2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and Accurately",
    Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language
    Design and Implementation, PLDI 1996
*/

==== sources/openscad/src/ext/json/json.hpp lines 19689-19709 sha256 956b8470871a2a9539184feee0f26e2722b4c9cf69e369ffb5dfdf6d9b471c31 ====
    /*!
    @brief check whether a string is UTF-8 encoded

    The function checks each byte of a string whether it is UTF-8 encoded. The
    result of the check is stored in the @a state parameter. The function must
    be called initially with state 0 (accept). State 1 means the string must
    be rejected, because the current byte is not allowed. If the string is
    completely processed, but the state is non-zero, the string ended
    prematurely; that is, the last byte indicated more bytes should have
    followed.

    @param[in,out] state  the state of the decoding
    @param[in,out] codep  codepoint (valid only if resulting state is UTF8_ACCEPT)
    @param[in] byte       next byte to decode
    @return               new state

    @note The function has been edited: a std::array is used.

    @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>
    @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/
    */

==== sources/openscad/src/ext/json/json.hpp lines 19804-19811 sha256 f783774f388a1ecdd5f776ee0f424da903ddd9272f680ea146c822b1ef0b4772 ====
// #include <nlohmann/ordered_map.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 20359-20359 sha256 3093030623171e203df658dd27f7bee2dcdf23ca103946c7727bfdb367de100a ====
        result["copyright"] = "(C) 2013-2025 Niels Lohmann";

==== sources/openscad/src/ext/json/json.hpp lines 25471-25478 sha256 6ae5d772c4c1daad9ed288b4b8384d53924da3df978e7536f7b2bd19e10518f6 ====
// #include <nlohmann/detail/macro_unscope.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/json/json.hpp lines 25518-25525 sha256 3d16cb71d367d08f13f9291a452bce5a577f8b5d92a1ab842eb092f8a9a15ae5 ====
// #include <nlohmann/thirdparty/hedley/hedley_undef.hpp>
//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.12.0
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

==== sources/openscad/src/ext/libtess2/Include/tesselator.h lines 1-27 sha256 3f795fef9ad0b015b07ff76e5ac75b76fb7546719984efc7c48a615704ce8d41 ====
also in: sources/openscad/src/ext/libtess2/Source/bucketalloc.c:1-27, sources/openscad/src/ext/libtess2/Source/bucketalloc.h:1-27, sources/openscad/src/ext/libtess2/Source/dict.c:1-27, sources/openscad/src/ext/libtess2/Source/dict.h:1-27, sources/openscad/src/ext/libtess2/Source/geom.c:1-27, sources/openscad/src/ext/libtess2/Source/geom.h:1-27, sources/openscad/src/ext/libtess2/Source/mesh.c:1-27, sources/openscad/src/ext/libtess2/Source/mesh.h:1-27, sources/openscad/src/ext/libtess2/Source/priorityq.c:1-27, sources/openscad/src/ext/libtess2/Source/priorityq.h:1-27, sources/openscad/src/ext/libtess2/Source/sweep.c:1-27, sources/openscad/src/ext/libtess2/Source/sweep.h:1-27, sources/openscad/src/ext/libtess2/Source/tess.c:1-27, sources/openscad/src/ext/libtess2/Source/tess.h:1-27
/*
** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 
** Copyright (C) [dates of first publication] Silicon Graphics, Inc.
** All Rights Reserved.
**
** 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 including the dates of first publication and either this
** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ 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 SILICON GRAPHICS, INC.
** 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.
** 
** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not
** be used in advertising or otherwise to promote the sale, use or other dealings in
** this Software without prior written authorization from Silicon Graphics, Inc.
*/

==== sources/openscad/src/ext/libtess2/Include/tesselator.h lines 28-30 sha256 6c9b85bcb96b112d8534ca27be50c70fbe1415d9e758626b9cb4a5e91df79d36 ====
also in: sources/openscad/src/ext/libtess2/Source/bucketalloc.c:28-30, sources/openscad/src/ext/libtess2/Source/bucketalloc.h:28-30
/*
** Author: Mikko Mononen, July 2009.
*/

==== sources/openscad/src/ext/libtess2/Source/dict.c lines 28-30 sha256 e779f9b261453b41a74804ba8ed67e68ef28e423c5057c1dd5baeb233f3681d1 ====
also in: sources/openscad/src/ext/libtess2/Source/dict.h:28-30, sources/openscad/src/ext/libtess2/Source/geom.c:28-30, sources/openscad/src/ext/libtess2/Source/geom.h:28-30, sources/openscad/src/ext/libtess2/Source/mesh.c:28-30, sources/openscad/src/ext/libtess2/Source/mesh.h:28-30, sources/openscad/src/ext/libtess2/Source/priorityq.c:28-30, sources/openscad/src/ext/libtess2/Source/priorityq.h:28-30, sources/openscad/src/ext/libtess2/Source/sweep.c:28-30, sources/openscad/src/ext/libtess2/Source/sweep.h:28-30, sources/openscad/src/ext/libtess2/Source/tess.c:28-30, sources/openscad/src/ext/libtess2/Source/tess.h:28-30
/*
** Author: Eric Veach, July 1994.
*/

==== sources/openscad/src/ext/libtess2/Source/geom.c lines 32-32 sha256 aef6199cda7ef030f1bda1041d9b329cf7f3a4c86ba01511367bcd8454905db4 ====
also in: sources/openscad/src/ext/libtess2/Source/mesh.c:32-32, sources/openscad/src/ext/libtess2/Source/priorityq.c:32-32
//#include "tesos.h"

==== sources/openscad/src/ext/lodepng/lodepng.cpp lines 1-24 sha256 4bf61ade1eac632785bfa525587b18b0baff8f5c4a6fa7e28270ec2e5f2336c7 ====
also in: sources/openscad/src/ext/lodepng/lodepng.h:1-24
/*
LodePNG version 20260102

Copyright (c) 2005-2026 Lode Vandevenne

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

    1. The origin of this software must not be misrepresented; you must not
    claim that you wrote the original software. If you use this software
    in a product, an acknowledgment in the product documentation would be
    appreciated but is not required.

    2. Altered source versions must be plainly marked as such, and must not be
    misrepresented as being the original software.

    3. This notice may not be removed or altered from any source
    distribution.
*/

==== sources/openscad/src/ext/lodepng/lodepng.cpp lines 26-29 sha256 f4751a5509f9bbcb70aa56b677f2873ebda91683b553121f59b983350f497f22 ====
/*
The manual and changelog are in the header file "lodepng.h"
Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C.
*/

==== sources/openscad/src/ext/lodepng/lodepng.h lines 515-534 sha256 9ca1ef08e7cbd9c5a61ab11e3a02f4c1e8b340323bca7d89b0e47ec9136122ce ====
  /*
  Non-international text chunks (tEXt and zTXt)

  The char** arrays each contain num strings. The actual messages are in
  text_strings, while text_keys are keywords that give a short description what
  the actual text represents, e.g. Title, Author, Description, or anything else.

  All the string fields below including strings, keys, names and language tags are null terminated.
  The PNG specification uses null characters for the keys, names and tags, and forbids null
  characters to appear in the main text which is why we can use null termination everywhere here.

  A keyword is minimum 1 character and maximum 79 characters long (plus the
  additional null terminator). It's discouraged to use a single line length
  longer than 79 characters for texts.

  Don't allocate these text buffers yourself. Use the init/cleanup functions
  correctly and use lodepng_add_text and lodepng_clear_text.

  Standard text chunk keywords and strings are encoded using Latin-1.
  */

==== sources/openscad/src/ext/lodepng/lodepng.h lines 1298-2187 sha256 b87afe462421f0de0654b28a57b8bc4ee0dd6df3d50f427e65694ea6d46c4206 ====
/*
LodePNG Documentation
---------------------

0. table of contents
--------------------

  1. about
   1.1. supported features
   1.2. features not supported
  2. C and C++ version
  3. security
  4. decoding
  5. encoding
  6. color conversions
    6.1. PNG color types
    6.2. color conversions
    6.3. padding bits
    6.4. A note about 16-bits per channel and endianness
  7. error values
  8. chunks and PNG editing
  9. compiler support
  10. examples
   10.1. decoder C++ example
   10.2. decoder C example
  11. state settings reference
  12. changes
  13. contact information


1. about
--------

PNG is a file format to store raster images losslessly with good compression,
supporting different color types and alpha channel.

LodePNG is a PNG codec according to the Portable Network Graphics (PNG)
Specification (Second Edition) - W3C Recommendation 10 November 2003.

The specifications used are:

*) Portable Network Graphics (PNG) Specification (Second Edition):
     http://www.w3.org/TR/2003/REC-PNG-20031110
*) RFC 1950 ZLIB Compressed Data Format version 3.3:
     http://www.gzip.org/zlib/rfc-zlib.html
*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3:
     http://www.gzip.org/zlib/rfc-deflate.html

The most recent version of LodePNG can currently be found at
http://lodev.org/lodepng/

LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds
extra functionality.

LodePNG exists out of two files:
-lodepng.h: the header file for both C and C++
-lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage

If you want to start using LodePNG right away without reading this doc, get the
examples from the LodePNG website to see how to use it in code, or check the
smaller examples in chapter 13 here.

LodePNG is simple but only supports the basic requirements. To achieve
simplicity, the following design choices were made: There are no dependencies
on any external library. There are functions to decode and encode a PNG with
a single function call, and extended versions of these functions taking a
LodePNGState struct allowing to specify or get more information. By default
the colors of the raw image are always RGB or RGBA, no matter what color type
the PNG file uses. To read and write files, there are simple functions to
convert the files to/from buffers in memory.

This all makes LodePNG suitable for loading textures in games, demos and small
programs, ... It's less suitable for full fledged image editors, loading PNGs
over network (it requires all the image data to be available before decoding can
begin), life-critical systems, ...

1.1. supported features
-----------------------

The following features are supported by the decoder:

*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image,
   or the same color type as the PNG
*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image
*) Adam7 interlace and deinterlace for any color type
*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk
*) support for alpha channels, including RGBA color model, translucent palettes and color keying
*) zlib decompression (inflate)
*) zlib compression (deflate)
*) CRC32 and ADLER32 checksums
*) colorimetric color profile conversions: currently experimentally available in lodepng_util.cpp only,
   plus alternatively ability to pass on chroma/gamma/ICC profile information to other color management system.
*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks.
*) the following chunks are supported by both encoder and decoder:
    IHDR: header information
    PLTE: color palette
    IDAT: pixel data
    IEND: the final chunk
    tRNS: transparency for palettized images
    tEXt: textual information
    zTXt: compressed textual information
    iTXt: international textual information
    bKGD: suggested background color
    pHYs: physical dimensions
    tIME: modification time
    cHRM: RGB chromaticities
    gAMA: RGB gamma correction
    iCCP: ICC color profile
    sRGB: rendering intent
    sBIT: significant bits

1.2. features not supported
---------------------------

The following features are not (yet) supported:

*) some features needed to make a conformant PNG-Editor might be still missing.
*) partial loading/stream processing. All data must be available and is processed in one call.
*) The hIST and sPLT public chunks are not (yet) supported but treated as unknown chunks


2. C and C++ version
--------------------

The C version uses buffers allocated with alloc that you need to free()
yourself. You need to use init and cleanup functions for each struct whenever
using a struct from the C version to avoid exploits and memory leaks.

The C++ version has extra functions with std::vectors in the interface and the
lodepng::State class which is a LodePNGState with constructor and destructor.

These files work without modification for both C and C++ compilers because all
the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers
ignore it, and the C code is made to compile both with strict ISO C90 and C++.

To use the C++ version, you need to rename the source file to lodepng.cpp
(instead of lodepng.c), and compile it with a C++ compiler.

To use the C version, you need to rename the source file to lodepng.c (instead
of lodepng.cpp), and compile it with a C compiler.


3. Security
-----------

Even if carefully designed, it's always possible that LodePNG contains possible
exploits. If you discover one, please let me know, and it will be fixed.

When using LodePNG, care has to be taken with the C version of LodePNG, as well
as the C-style structs when working with C++. The following conventions are used
for all C-style structs:

-if a struct has a corresponding init function, always call the init function when making a new one
-if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks
-if a struct has a corresponding copy function, use the copy function instead of "=".
 The destination must also be inited already.


4. Decoding
-----------

Decoding converts a PNG compressed image to a raw pixel buffer.

Most documentation on using the decoder is at its declarations in the header
above. For C, simple decoding can be done with functions such as
lodepng_decode32, and more advanced decoding can be done with the struct
LodePNGState and lodepng_decode. For C++, all decoding can be done with the
various lodepng::decode functions, and lodepng::State can be used for advanced
features.

When using the LodePNGState, it uses the following fields for decoding:
*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here
*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get
*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use

LodePNGInfo info_png
--------------------

After decoding, this contains extra information of the PNG image, except the actual
pixels, width and height because these are already gotten directly from the decoder
functions.

It contains for example the original color type of the PNG image, text comments,
suggested background color, etc... More details about the LodePNGInfo struct are
at its declaration documentation.

LodePNGColorMode info_raw
-------------------------

When decoding, here you can specify which color type you want
the resulting raw image to be. If this is different from the colortype of the
PNG, then the decoder will automatically convert the result. This conversion
always works, except if you want it to convert a color PNG to grayscale or to
a palette with missing colors.

By default, 32-bit color is used for the result.

LodePNGDecoderSettings decoder
------------------------------

The settings can be used to ignore the errors created by invalid CRC and Adler32
chunks, and to disable the decoding of tEXt chunks.

There's also a setting color_convert, true by default. If false, no conversion
is done, the resulting data will be as it was in the PNG (after decompression)
and you'll have to puzzle the colors of the pixels together yourself using the
color type information in the LodePNGInfo.


5. Encoding
-----------

Encoding converts a raw pixel buffer to a PNG compressed image.

Most documentation on using the encoder is at its declarations in the header
above. For C, simple encoding can be done with functions such as
lodepng_encode32, and more advanced decoding can be done with the struct
LodePNGState and lodepng_encode. For C++, all encoding can be done with the
various lodepng::encode functions, and lodepng::State can be used for advanced
features.

Like the decoder, the encoder can also give errors. However it gives less errors
since the encoder input is trusted, the decoder input (a PNG image that could
be forged by anyone) is not trusted.

When using the LodePNGState, it uses the following fields for encoding:
*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be.
*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has
*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use

LodePNGInfo info_png
--------------------

When encoding, you use this the opposite way as when decoding: for encoding,
you fill in the values you want the PNG to have before encoding. By default it's
not needed to specify a color type for the PNG since it's automatically chosen,
but it's possible to choose it yourself given the right settings.

The encoder will not always exactly match the LodePNGInfo struct you give,
it tries as close as possible. Some things are ignored by the encoder. The
encoder uses, for example, the following settings from it when applicable:
colortype and bitdepth, text chunks, time chunk, the color key, the palette, the
background color, the interlace method, unknown chunks, ...

When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk.
If the palette contains any colors for which the alpha channel is not 255 (so
there are translucent colors in the palette), it'll add a tRNS chunk.

LodePNGColorMode info_raw
-------------------------

You specify the color type of the raw image that you give to the input here,
including a possible transparent color key and palette you happen to be using in
your raw image data.

By default, 32-bit color is assumed, meaning your input has to be in RGBA
format with 4 bytes (unsigned chars) per pixel.

LodePNGEncoderSettings encoder
------------------------------

The following settings are supported (some are in sub-structs):
*) auto_convert: when this option is enabled, the encoder will
automatically choose the smallest possible color mode (including color key) that
can encode the colors of all pixels without information loss.
*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree,
   2 = dynamic huffman tree (best compression). Should be 2 for proper
   compression.
*) use_lz77: whether or not to use LZ77 for compressed block types. Should be
   true for proper compression.
*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value
   2048 by default, but can be set to 32768 for better, but slow, compression.
*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE
   chunk if force_palette is true. This can used as suggested palette to convert
   to by viewers that don't support more than 256 colors (if those still exist)
*) add_id: add text chunk "Encoder: LodePNG <version>" to the image.
*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks.
  zTXt chunks use zlib compression on the text. This gives a smaller result on
  large texts but a larger result on small texts (such as a single program name).
  It's all tEXt or all zTXt though, there's no separate setting per text yet.


6. color conversions
--------------------

An important thing to note about LodePNG, is that the color type of the PNG, and
the color type of the raw image, are completely independent. By default, when
you decode a PNG, you get the result as a raw image in the color type you want,
no matter whether the PNG was encoded with a palette, grayscale or RGBA color.
And if you encode an image, by default LodePNG will automatically choose the PNG
color type that gives good compression based on the values of colors and amount
of colors in the image. It can be configured to let you control it instead as
well, though.

To be able to do this, LodePNG does conversions from one color mode to another.
It can convert from almost any color type to any other color type, except the
following conversions: RGB to grayscale is not supported, and converting to a
palette when the palette doesn't have a required color is not supported. This is
not supported on purpose: this is information loss which requires a color
reduction algorithm that is beyond the scope of a PNG encoder (yes, RGB to gray
is easy, but there are multiple ways if you want to give some channels more
weight).

By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB
color, no matter what color type the PNG has. And by default when encoding,
LodePNG automatically picks the best color model for the output PNG, and expects
the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control
the color format of the images yourself, you can skip this chapter.

6.1. PNG color types
--------------------

A PNG image can have many color types, ranging from 1-bit color to 64-bit color,
as well as palettized color modes. After the zlib decompression and unfiltering
in the PNG image is done, the raw pixel data will have that color type and thus
a certain amount of bits per pixel. If you want the output raw image after
decoding to have another color type, a conversion is done by LodePNG.

The PNG specification gives the following color types:

0: grayscale, bit depths 1, 2, 4, 8, 16
2: RGB, bit depths 8 and 16
3: palette, bit depths 1, 2, 4 and 8
4: grayscale with alpha, bit depths 8 and 16
6: RGBA, bit depths 8 and 16

Bit depth is the amount of bits per pixel per color channel. So the total amount
of bits per pixel is: amount of channels * bitdepth.

6.2. color conversions
----------------------

As explained in the sections about the encoder and decoder, you can specify
color types and bit depths in info_png and info_raw to change the default
behaviour.

If, when decoding, you want the raw image to be something else than the default,
you need to set the color type and bit depth you want in the LodePNGColorMode,
or the parameters colortype and bitdepth of the simple decoding function.

If, when encoding, you use another color type than the default in the raw input
image, you need to specify its color type and bit depth in the LodePNGColorMode
of the raw image, or use the parameters colortype and bitdepth of the simple
encoding function.

If, when encoding, you don't want LodePNG to choose the output PNG color type
but control it yourself, you need to set auto_convert in the encoder settings
to false, and specify the color type you want in the LodePNGInfo of the
encoder (including palette: it can generate a palette if auto_convert is true,
otherwise not).

If the input and output color type differ (whether user chosen or auto chosen),
LodePNG will do a color conversion, which follows the rules below, and may
sometimes result in an error.

To avoid some confusion:
-the decoder converts from PNG to raw image
-the encoder converts from raw image to PNG
-the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image
-the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG
-when encoding, the color type in LodePNGInfo is ignored if auto_convert
 is enabled, it is automatically generated instead
-when decoding, the color type in LodePNGInfo is set by the decoder to that of the original
 PNG image, but it can be ignored since the raw image has the color type you requested instead
-if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion
 between the color types is done if the color types are supported. If it is not
 supported, an error is returned. If the types are the same, no conversion is done.
-even though some conversions aren't supported, LodePNG supports loading PNGs from any
 colortype and saving PNGs to any colortype, sometimes it just requires preparing
 the raw image correctly before encoding.
-both encoder and decoder use the same color converter.

The function lodepng_convert does the color conversion. It is available in the
interface but normally isn't needed since the encoder and decoder already call
it.

Non supported color conversions:
-color to grayscale when non-gray pixels are present: no error is thrown, but
the result will look ugly because only the red channel is taken (it assumes all
three channels are the same in this case so ignores green and blue). The reason
no error is given is to allow converting from three-channel grayscale images to
one-channel even if there are numerical imprecisions.
-anything to palette when the palette does not have an exact match for a from-color
in it: in this case an error is thrown

Supported color conversions:
-anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA
-any gray or gray+alpha, to gray or gray+alpha
-anything to a palette, as long as the palette has the requested colors in it
-removing alpha channel
-higher to smaller bitdepth, and vice versa

If you want no color conversion to be done (e.g. for speed or control):
-In the encoder, you can make it save a PNG with any color type by giving the
raw color mode and LodePNGInfo the same color mode, and setting auto_convert to
false.
-In the decoder, you can make it store the pixel data in the same color type
as the PNG has, by setting the color_convert setting to false. Settings in
info_raw are then ignored.

6.3. padding bits
-----------------

In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines
have a bit amount that isn't a multiple of 8, then padding bits are used so that each
scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output.
The raw input image you give to the encoder, and the raw output image you get from the decoder
will NOT have these padding bits, e.g. in the case of a 1-bit image with a width
of 7 pixels, the first pixel of the second scanline will the 8th bit of the first byte,
not the first bit of a new byte.

6.4. A note about 16-bits per channel and endianness
----------------------------------------------------

LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like
for any other color format. The 16-bit values are stored in big endian (most
significant byte first) in these arrays. This is the opposite order of the
little endian used by x86 CPU's.

LodePNG always uses big endian because the PNG file format does so internally.
Conversions to other formats than PNG uses internally are not supported by
LodePNG on purpose, there are myriads of formats, including endianness of 16-bit
colors, the order in which you store R, G, B and A, and so on. Supporting and
converting to/from all that is outside the scope of LodePNG.

This may mean that, depending on your use case, you may want to convert the big
endian output of LodePNG to little endian with a for loop. This is certainly not
always needed, many applications and libraries support big endian 16-bit colors
anyway, but it means you cannot simply cast the unsigned char* buffer to an
unsigned short* buffer on x86 CPUs.


7. error values
---------------

All functions in LodePNG that return an error code, return 0 if everything went
OK, or a non-zero code if there was an error.

The meaning of the LodePNG error values can be retrieved with the function
lodepng_error_text: given the numerical error code, it returns a description
of the error in English as a string.

Check the implementation of lodepng_error_text to see the meaning of each code.

It is not recommended to use the numerical values to programmatically make
different decisions based on error types as the numbers are not guaranteed to
stay backwards compatible. They are for human consumption only. Programmatically
only 0 or non-0 matter.


8. chunks and PNG editing
-------------------------

If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG
editor that should follow the rules about handling of unknown chunks, or if your
program is able to read other types of chunks than the ones handled by LodePNG,
then that's possible with the chunk functions of LodePNG.

A PNG chunk has the following layout:

4 bytes length
4 bytes type name
length bytes data
4 bytes CRC

8.1. iterating through chunks
-----------------------------

If you have a buffer containing the PNG image data, then the first chunk (the
IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the
signature of the PNG and are not part of a chunk. But if you start at byte 8
then you have a chunk, and can check the following things of it.

NOTE: none of these functions check for memory buffer boundaries. To avoid
exploits, always make sure the buffer contains all the data of the chunks.
When using lodepng_chunk_next, make sure the returned value is within the
allocated memory.

unsigned lodepng_chunk_length(const unsigned char* chunk):

Get the length of the chunk's data. The total chunk length is this length + 12.

void lodepng_chunk_type(char type[5], const unsigned char* chunk):
unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type):

Get the type of the chunk or compare if it's a certain type

unsigned char lodepng_chunk_critical(const unsigned char* chunk):
unsigned char lodepng_chunk_private(const unsigned char* chunk):
unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk):

Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are).
Check if the chunk is private (public chunks are part of the standard, private ones not).
Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical
chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your
program doesn't handle that type of unknown chunk.

unsigned char* lodepng_chunk_data(unsigned char* chunk):
const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk):

Get a pointer to the start of the data of the chunk.

unsigned lodepng_chunk_check_crc(const unsigned char* chunk):
void lodepng_chunk_generate_crc(unsigned char* chunk):

Check if the crc is correct or generate a correct one.

unsigned char* lodepng_chunk_next(unsigned char* chunk):
const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk):

Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these
functions do no boundary checking of the allocated data whatsoever, so make sure there is enough
data available in the buffer to be able to go to the next chunk.

unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk):
unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length,
                              const char* type, const unsigned char* data):

These functions are used to create new chunks that are appended to the data in *out that has
length *outsize. The append function appends an existing chunk to the new data. The create
function creates a new chunk with the given parameters and appends it. Type is the 4-letter
name of the chunk.

8.2. chunks in info_png
-----------------------

The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3
buffers (each with size) to contain 3 types of unknown chunks:
the ones that come before the PLTE chunk, the ones that come between the PLTE
and the IDAT chunks, and the ones that come after the IDAT chunks.
It's necessary to make the distinction between these 3 cases because the PNG
standard forces to keep the ordering of unknown chunks compared to the critical
chunks, but does not force any other ordering rules.

info_png.unknown_chunks_data[0] is the chunks before PLTE
info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT
info_png.unknown_chunks_data[2] is the chunks after IDAT

The chunks in these 3 buffers can be iterated through and read by using the same
way described in the previous subchapter.

When using the decoder to decode a PNG, you can make it store all unknown chunks
if you set the option settings.remember_unknown_chunks to 1. By default, this
option is off (0).

The encoder will always encode unknown chunks that are stored in the info_png.
If you need it to add a particular chunk that isn't known by LodePNG, you can
use lodepng_chunk_append or lodepng_chunk_create to the chunk data in
info_png.unknown_chunks_data[x].

Chunks that are known by LodePNG should not be added in that way. E.g. to make
LodePNG add a bKGD chunk, set background_defined to true and add the correct
parameters there instead.


9. compiler support
-------------------

No libraries other than the current standard C library are needed to compile
LodePNG. For the C++ version, only the standard C++ library is needed on top.
Add the files lodepng.c(pp) and lodepng.h to your project, include
lodepng.h where needed, and your program can read/write PNG files.

It is compatible with C90 and up, and C++03 and up.

If performance is important, use optimization when compiling! For both the
encoder and decoder, this makes a large difference.

Make sure that LodePNG is compiled with the same compiler of the same version
and with the same settings as the rest of the program, or the interfaces with
std::vectors and std::strings in C++ can be incompatible.

CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets.

*) gcc and g++

LodePNG is developed in gcc so this compiler is natively supported. It gives no
warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++
version 4.7.1 on Linux, 32-bit and 64-bit.

*) Clang

Fully supported and warning-free.

*) Mingw

The Mingw compiler (a port of gcc for Windows) should be fully supported by
LodePNG.

*) Visual Studio and Visual C++ Express Edition

LodePNG should be warning-free with warning level W4. Two warnings were disabled
with pragmas though: warning 4244 about implicit conversions, and warning 4996
where it wants to use a non-standard function fopen_s instead of the standard C
fopen.

Visual Studio may want "stdafx.h" files to be included in each source file and
give an error "unexpected end of file while looking for precompiled header".
This is not standard C++ and will not be added to the stock LodePNG. You can
disable it for lodepng.cpp only by right clicking it, Properties, C/C++,
Precompiled Headers, and set it to Not Using Precompiled Headers there.

NOTE: Modern versions of VS should be fully supported, but old versions, e.g.
VS6, are not guaranteed to work.

*) Compilers on Macintosh

LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for
C and C++.

*) Other Compilers

If you encounter problems on any compilers, feel free to let me know and I may
try to fix it if the compiler is modern and standards compliant.


10. examples
------------

This decoder example shows the most basic usage of LodePNG. More complex
examples can be found on the LodePNG website.

NOTE: these examples do not support wide-character filenames, you can use an
external method to handle such files and encode or decode in-memory

10.1. decoder C++ example
-------------------------

#include "lodepng.h"
#include <iostream>

int main(int argc, char *argv[]) {
  const char* filename = argc > 1 ? argv[1] : "test.png";

  //load and decode
  std::vector<unsigned char> image;
  unsigned width, height;
  unsigned error = lodepng::decode(image, width, height, filename);

  //if there's an error, display it
  if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl;

  //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ...
}

10.2. decoder C example
-----------------------

#include "lodepng.h"

int main(int argc, char *argv[]) {
  unsigned error;
  unsigned char* image;
  size_t width, height;
  const char* filename = argc > 1 ? argv[1] : "test.png";

  error = lodepng_decode32_file(&image, &width, &height, filename);

  if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error));

  / * use image here * /

  free(image);
  return 0;
}

11. state settings reference
----------------------------

A quick reference of some settings to set on the LodePNGState

For decoding:

state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums
state.decoder.zlibsettings.custom_...: use custom inflate function
state.decoder.ignore_crc: ignore CRC checksums
state.decoder.ignore_critical: ignore unknown critical chunks
state.decoder.ignore_end: ignore missing IEND chunk. May fail if this corruption causes other errors
state.decoder.color_convert: convert internal PNG color to chosen one
state.decoder.read_text_chunks: whether to read in text metadata chunks
state.decoder.remember_unknown_chunks: whether to read in unknown chunks
state.info_raw.colortype: desired color type for decoded image
state.info_raw.bitdepth: desired bit depth for decoded image
state.info_raw....: more color settings, see struct LodePNGColorMode
state.info_png....: no settings for decoder but ouput, see struct LodePNGInfo

For encoding:

state.encoder.zlibsettings.btype: disable compression by setting it to 0
state.encoder.zlibsettings.use_lz77: use LZ77 in compression
state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize
state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match
state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching
state.encoder.zlibsettings.lazymatching: try one more LZ77 matching
state.encoder.zlibsettings.custom_...: use custom deflate function
state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png
state.encoder.filter_palette_zero: PNG filter strategy for palette
state.encoder.filter_strategy: PNG filter strategy to encode with
state.encoder.force_palette: add palette even if not encoding to one
state.encoder.add_id: add LodePNG identifier and version as a text chunk
state.encoder.text_compression: use compressed text chunks for metadata
state.info_raw.colortype: color type of raw input image you provide
state.info_raw.bitdepth: bit depth of raw input image you provide
state.info_raw: more color settings, see struct LodePNGColorMode
state.info_png.color.colortype: desired color type if auto_convert is false
state.info_png.color.bitdepth: desired bit depth if auto_convert is false
state.info_png.color....: more color settings, see struct LodePNGColorMode
state.info_png....: more PNG related settings, see struct LodePNGInfo


12. changes
-----------

The version number of LodePNG is the date of the change given in the format
yyyymmdd.

Some changes aren't backwards compatible. Those are indicated with a (!)
symbol.

Not all changes are listed here, the commit history in github lists more:
https://github.com/lvandeve/lodepng

*) 6 may 2025: renamed mDCv to mDCV and cLLi to cLLI as per the recent rename
   in the draft png third edition spec. Please note that while the third
   edition is not finalized, backwards-incompatible changes to its features are
   possible.
*) 23 dec 2024: added support for the mDCv and cLLi chunks (for png third
   edition spec)
*) 22 dec 2024: added support for the cICP chunk (for png third edition spec)
*) 15 dec 2024: added support for the eXIf chunk (for png third edition spec)
*) 10 apr 2023: faster CRC32 implementation, but with larger lookup table.
*) 13 jun 2022: added support for the sBIT chunk.
*) 09 jan 2022: minor decoder speed improvements.
*) 27 jun 2021: added warnings that file reading/writing functions don't support
   wide-character filenames (support for this is not planned, opening files is
   not the core part of PNG decoding/decoding and is platform dependent).
*) 17 oct 2020: prevent decoding too large text/icc chunks by default.
*) 06 mar 2020: simplified some of the dynamic memory allocations.
*) 12 jan 2020: (!) added 'end' argument to lodepng_chunk_next to allow correct
   overflow checks.
*) 14 aug 2019: around 25% faster decoding thanks to huffman lookup tables.
*) 15 jun 2019: (!) auto_choose_color API changed (for bugfix: don't use palette
   if gray ICC profile) and non-ICC LodePNGColorProfile renamed to
   LodePNGColorStats.
*) 30 dec 2018: code style changes only: removed newlines before opening braces.
*) 10 sep 2018: added way to inspect metadata chunks without full decoding.
*) 19 aug 2018: (!) fixed color mode bKGD is encoded with and made it use
   palette index in case of palette.
*) 10 aug 2018: (!) added support for gAMA, cHRM, sRGB and iCCP chunks. This
   change is backwards compatible unless you relied on unknown_chunks for those.
*) 11 jun 2018: less restrictive check for pixel size integer overflow
*) 14 jan 2018: allow optionally ignoring a few more recoverable errors
*) 17 sep 2017: fix memory leak for some encoder input error cases
*) 27 nov 2016: grey+alpha auto color model detection bugfix
*) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort).
*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within
   the limits of pure C90).
*) 08 dec 2015: Made load_file function return error if file can't be opened.
*) 24 oct 2015: Bugfix with decoding to palette output.
*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding.
*) 24 aug 2014: Moved to github
*) 23 aug 2014: Reduced needless memory usage of decoder.
*) 28 jun 2014: Removed fix_png setting, always support palette OOB for
    simplicity. Made ColorProfile public.
*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization.
*) 22 dec 2013: Power of two windowsize required for optimization.
*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key.
*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png).
*) 11 mar 2013: (!) Bugfix with custom free. Changed from "my" to "lodepng_"
    prefix for the custom allocators and made it possible with a new #define to
    use custom ones in your project without needing to change lodepng's code.
*) 28 jan 2013: Bugfix with color key.
*) 27 oct 2012: Tweaks in text chunk keyword length error handling.
*) 8 oct 2012: (!) Added new filter strategy (entropy) and new auto color mode.
    (no palette). Better deflate tree encoding. New compression tweak settings.
    Faster color conversions while decoding. Some internal cleanups.
*) 23 sep 2012: Reduced warnings in Visual Studio a little bit.
*) 1 sep 2012: (!) Removed #define's for giving custom (de)compression functions
    and made it work with function pointers instead.
*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc
    and free functions and toggle #defines from compiler flags. Small fixes.
*) 6 may 2012: (!) Made plugging in custom zlib/deflate functions more flexible.
*) 22 apr 2012: (!) Made interface more consistent, renaming a lot. Removed
    redundant C++ codec classes. Reduced amount of structs. Everything changed,
    but it is cleaner now imho and functionality remains the same. Also fixed
    several bugs and shrunk the implementation code. Made new samples.
*) 6 nov 2011: (!) By default, the encoder now automatically chooses the best
    PNG color model and bit depth, based on the amount and type of colors of the
    raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color.
*) 9 oct 2011: simpler hash chain implementation for the encoder.
*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching.
*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking.
    A bug with the PNG filtertype heuristic was fixed, so that it chooses much
    better ones (it's quite significant). A setting to do an experimental, slow,
    brute force search for PNG filter types is added.
*) 17 aug 2011: (!) changed some C zlib related function names.
*) 16 aug 2011: made the code less wide (max 120 characters per line).
*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors.
*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled.
*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman
    to optimize long sequences of zeros.
*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and
    LodePNG_InfoColor_canHaveAlpha functions for convenience.
*) 7 nov 2010: added LodePNG_error_text function to get error code description.
*) 30 oct 2010: made decoding slightly faster
*) 26 oct 2010: (!) changed some C function and struct names (more consistent).
     Reorganized the documentation and the declaration order in the header.
*) 08 aug 2010: only changed some comments and external samples.
*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version.
*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers.
*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could
    read by ignoring the problem but windows apps couldn't.
*) 06 jun 2008: added more error checks for out of memory cases.
*) 26 apr 2008: added a few more checks here and there to ensure more safety.
*) 06 mar 2008: crash with encoding of strings fixed
*) 02 feb 2008: support for international text chunks added (iTXt)
*) 23 jan 2008: small cleanups, and #defines to divide code in sections
*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor.
*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder.
*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added
    Also various fixes, such as in the deflate and the padding bits code.
*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved
    filtering code of encoder.
*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A
    C++ wrapper around this provides an interface almost identical to before.
    Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code
    are together in these files but it works both for C and C++ compilers.
*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks
*) 30 aug 2007: bug fixed which makes this Borland C++ compatible
*) 09 aug 2007: some VS2005 warnings removed again
*) 21 jul 2007: deflate code placed in new namespace separate from zlib code
*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images
*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing
    invalid std::vector element [0] fixed, and level 3 and 4 warnings removed
*) 02 jun 2007: made the encoder add a tag with version by default
*) 27 may 2007: zlib and png code separated (but still in the same file),
    simple encoder/decoder functions added for more simple usage cases
*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69),
    moved some examples from here to lodepng_examples.cpp
*) 12 may 2007: palette decoding bug fixed
*) 24 apr 2007: changed the license from BSD to the zlib license
*) 11 mar 2007: very simple addition: ability to encode bKGD chunks.
*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding
    palettized PNG images. Plus little interface change with palette and texts.
*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes.
    Fixed a bug where the end code of a block had length 0 in the Huffman tree.
*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented
    and supported by the encoder, resulting in smaller PNGs at the output.
*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone.
*) 24 jan 2007: gave encoder an error interface. Added color conversion from any
    greyscale type to 8-bit greyscale with or without alpha.
*) 21 jan 2007: (!) Totally changed the interface. It allows more color types
    to convert to and is more uniform. See the manual for how it works now.
*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days:
    encode/decode custom tEXt chunks, separate classes for zlib & deflate, and
    at last made the decoder give errors for incorrect Adler32 or Crc.
*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel.
*) 29 dec 2006: Added support for encoding images without alpha channel, and
    cleaned out code as well as making certain parts faster.
*) 28 dec 2006: Added "Settings" to the encoder.
*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now.
    Removed some code duplication in the decoder. Fixed little bug in an example.
*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter.
    Fixed a bug of the decoder with 16-bit per color.
*) 15 oct 2006: Changed documentation structure
*) 09 oct 2006: Encoder class added. It encodes a valid PNG image from the
    given image buffer, however for now it's not compressed.
*) 08 sep 2006: (!) Changed to interface with a Decoder class
*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different
    way. Renamed decodePNG to decodePNGGeneric.
*) 29 jul 2006: (!) Changed the interface: image info is now returned as a
    struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy.
*) 28 jul 2006: Cleaned the code and added new error checks.
    Corrected terminology "deflate" into "inflate".
*) 23 jun 2006: Added SDL example in the documentation in the header, this
    example allows easy debugging by displaying the PNG and its transparency.
*) 22 jun 2006: (!) Changed way to obtain error value. Added
    loadFile function for convenience. Made decodePNG32 faster.
*) 21 jun 2006: (!) Changed type of info vector to unsigned.
    Changed position of palette in info vector. Fixed an important bug that
    happened on PNGs with an uncompressed block.
*) 16 jun 2006: Internally changed unsigned into unsigned where
    needed, and performed some optimizations.
*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them
    in LodePNG namespace. Changed the order of the parameters. Rewrote the
    documentation in the header. Renamed files to lodepng.cpp and lodepng.h
*) 22 apr 2006: Optimized and improved some code
*) 07 sep 2005: (!) Changed to std::vector interface
*) 12 aug 2005: Initial release (C++, decoder only)
*/

==== sources/openscad/src/geometry/cgal/cgalutils-applyops.cc lines 1-2 sha256 52bdac4451fda0e9d4ec36b0e27543ef79abecabccc1617289ffbbb9de77008c ====
also in: sources/openscad/src/geometry/cgal/cgalutils-project.cc:1-2, sources/openscad/src/geometry/cgal/cgalutils.cc:1-2, sources/openscad/src/geometry/manifold/manifold-applyops.cc:1-2
// this file is split into many separate cgalutils* files
// in order to workaround gcc 4.9.1 crashing on systems with only 2GB of RAM

==== sources/openscad/src/geometry/cgal/cgalutils-closed.cc lines 1-1 sha256 8b82a350308d0120ebd9a41f48fa8c9a0f93a6d2f770e224c4bbd81619204680 ====
also in: sources/openscad/src/geometry/cgal/cgalutils-kernel.cc:1-1, sources/openscad/src/geometry/cgal/cgalutils-orient.cc:1-1, sources/openscad/src/geometry/cgal/cgalutils-triangulate.cc:1-1
// Portions of this file are Copyright 2021 Google LLC, and licensed under GPL2+. See COPYING.

==== sources/openscad/src/geometry/linalg.cc lines 52-67 sha256 c0386efcd6109468bd15548e2dac85d62c1056fc03fc1ba4e3ad943b50201e1b ====
/* Hash a floating point number, copied almost line by line from
   Python's pyhash.c, originally by the Python team, Mark Dickinson, et al.
   The copyright License for this code can be found in under
   ../doc/Python-LICENSE.TXT. Changes from the original code include
   de-scattering typedefs, and removing the -1 special return case.

   This is designed so srand() will work better with floating point
   numbers. An oversimplified explanation is that the code calculates the
   Remainder of the input divided by 2^31, in a very portable way. See also:

   http://bob.ippoli.to/archives/2010/03/23/py3k-unified-numeric-hash/
   https://github.com/python/cpython/blob/master/Python/pyhash.c
   https://github.com/python/cpython/blob/master/Include/pyhash.h
   http://stackoverflow.com/questions/4238122/hash-function-for-floats
   http://betterexplained.com/articles/fun-with-modular-arithmetic/
 */

==== sources/openscad/src/geometry/manifold/ManifoldGeometry.cc lines 1-1 sha256 4bf9329e8f999570b0efb639cd7069bf251f24ffbfac8d593380f711b377f454 ====
also in: sources/openscad/src/geometry/manifold/ManifoldGeometry.h:1-1, sources/openscad/src/geometry/manifold/manifold-applyops-minkowski.cc:1-1, sources/openscad/src/geometry/manifold/manifoldutils.cc:1-1
// Portions of this file are Copyright 2023 Google LLC, and licensed under GPL2+. See COPYING.

==== sources/openscad/src/gui/input/InputDriver.h lines 1-25 sha256 438553cd3edd721611c50f4f7c0d84481cb2828100108aaf9e9ee2433e6d578f ====
also in: sources/openscad/src/gui/input/InputDriverEvent.h:1-25, sources/openscad/src/gui/input/InputDriverManager.h:1-25, sources/openscad/src/gui/input/InputEventMapper.h:1-25
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2009-2015 Clifford Wolf <clifford@clifford.at> and
 *                          Marius Kintel <marius@kintel.net>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/io/export_3mf_v2.cc lines 1-25 sha256 7a03dcfca4b66d3414e9efb39c655d84205b96ee6c6bd83c0e5d7572e453c3a9 ====
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2009-2025 Clifford Wolf <clifford@clifford.at> and
 *                          Marius Kintel <marius@kintel.net>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/io/export_obj.cc lines 1-26 sha256 8e8c9fbde9adb656236fa18710ceb81ff2570aea5f4d044ab9e0ec6ba8abd52b ====
also in: sources/openscad/src/io/export_off.cc:1-26
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and
 *                          Marius Kintel <marius@kintel.net>
 *  Copyright (C) 2021      Konstantin Podsvirov <konstantin@podsvirov.pro>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/io/export_param.cc lines 1-25 sha256 699991483f7ce2b82127200bf7618d8ec95f80d11f37c492af75721432cc01bd ====
also in: sources/openscad/src/io/import_json.cc:1-25
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2009-2021 Clifford Wolf <clifford@clifford.at> and
 *                          Marius Kintel <marius@kintel.net>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/io/export_pov.cc lines 1-25 sha256 26e522e80528151eb95b44281a829158ece0d9cbd6b6b0dbbb4f6de57746a440 ====
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2021      Konstantin Podsvirov <konstantin@podsvirov.pro>
 *         Povray 2024      Folkert van Heusden  <mail@vanheusden.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/io/export_wrl.cc lines 1-24 sha256 b91970281df18ef0e2891e037c8888089aa1d7f52209b790c5cec28d72f09312 ====
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2021      Konstantin Podsvirov <konstantin@podsvirov.pro>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/io/import_3mf_v2.cc lines 1-25 sha256 666716af212c92308a5cb9ead1acee5b2d608d0d1df42272ef929ed896074c9b ====
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2009-2024 Clifford Wolf <clifford@clifford.at> and
 *                          Marius Kintel <marius@kintel.net>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/io/import_svg.cc lines 1-25 sha256 929602462404b00271346b49828269ad8b8de4d1764afc8a2f3250519336a982 ====
also in: sources/openscad/src/version.h:1-25
/*
 *  OpenSCAD (www.openscad.org)
 *  Copyright (C) 2009-2019 Clifford Wolf <clifford@clifford.at> and
 *                          Marius Kintel <marius@kintel.net>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  As a special exception, you have permission to link this program
 *  with the CGAL library and distribute executables, as long as you
 *  follow the requirements of the GNU GPL in regard to all of the
 *  software in the executable aside from CGAL.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

==== sources/openscad/src/libsvg/circle.cc lines 1-24 sha256 e08ec3b10528f23d84626bf92664da4f1578eee4b109a03985ab1dd3ff8410b6 ====
also in: sources/openscad/src/libsvg/circle.h:1-24, sources/openscad/src/libsvg/data.cc:1-24, sources/openscad/src/libsvg/data.h:1-24, sources/openscad/src/libsvg/ellipse.cc:1-24, sources/openscad/src/libsvg/ellipse.h:1-24, sources/openscad/src/libsvg/group.cc:1-24, sources/openscad/src/libsvg/group.h:1-24, sources/openscad/src/libsvg/libsvg.cc:1-24, sources/openscad/src/libsvg/libsvg.h:1-24, sources/openscad/src/libsvg/line.cc:1-24, sources/openscad/src/libsvg/line.h:1-24, sources/openscad/src/libsvg/path.cc:1-24, sources/openscad/src/libsvg/path.h:1-24, sources/openscad/src/libsvg/polygon.cc:1-24, sources/openscad/src/libsvg/polygon.h:1-24, sources/openscad/src/libsvg/polyline.cc:1-24, sources/openscad/src/libsvg/polyline.h:1-24, sources/openscad/src/libsvg/rect.cc:1-24, sources/openscad/src/libsvg/rect.h:1-24, sources/openscad/src/libsvg/shape.cc:1-24, sources/openscad/src/libsvg/shape.h:1-24, sources/openscad/src/libsvg/svgpage.cc:1-24, sources/openscad/src/libsvg/svgpage.h:1-24, sources/openscad/src/libsvg/text.cc:1-24, sources/openscad/src/libsvg/text.h:1-24, sources/openscad/src/libsvg/transformation.cc:1-24, sources/openscad/src/libsvg/transformation.h:1-24, sources/openscad/src/libsvg/tspan.cc:1-24, sources/openscad/src/libsvg/tspan.h:1-24, sources/openscad/src/libsvg/use.cc:1-24, sources/openscad/src/libsvg/use.h:1-24, sources/openscad/src/libsvg/util.cc:1-24, sources/openscad/src/libsvg/util.h:1-24
/*
 * The MIT License
 *
 * Copyright (c) 2016-2018, Torsten Paul <torsten.paul@gmx.de>,
 *                          Marius Kintel <marius@kintel.net>
 *
 * 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.
 */

==== sources/openscad/src/libsvg/path.cc lines 154-156 sha256 2c85f247754863d9a38e4c85fa697c0e218098536b25f48da6ee55ca35758230 ====
also in: sources/openscad/src/libsvg/path.cc:172-174
  // Prior to https://github.com/openscad/openscad/commit/f5816258db263408a7aa2feec1fafffe77644662
  // fn was set to a fixed value of 20 where this is now used.
  // The author decided it should never be smaller than this original value.

==== sources/openscad/src/utils/compiler_specific.h lines 1-23 sha256 ffb7e200913c1090ba9d7ed7115a49b4c0e8689c31ffe380015e8de0ad14461c ====
/*
 * The MIT License
 *
 * Copyright (c) 2019, OpenSCAD Authors
 *
 * 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.
 */

==== sources/openscad/src/utils/degree_trig.h lines 26-28 sha256 7daf2bb17a81e47b881a5bd1444c5da34ef34c1f5fe9e2d3857e54f290135f5d ====
//
// Trigonometry function taking degrees, accurate for 30, 45, 60 and 90, etc.
//

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/include/clipper2/clipper.core.h lines 1-8 sha256 2665f74d6a818450b16fd572f2417d7134b42df1c58e9d7c11ad13cb88ca2de2 ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  12 October 2025                                                 *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2025                                         *
* Purpose   :  Core Clipper Library structures and functions                   *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/include/clipper2/clipper.engine.h lines 1-8 sha256 052e84b5a3b7a2b88fa63f9bc103df67207eacbe7b773bca8541a765a1c6af7f ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  17 September 2024                                               *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2024                                         *
* Purpose   :  This is the main polygon clipping module                        *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/include/clipper2/clipper.h lines 1-8 sha256 fdabb1817ec5a1c711ae7c3c29b1c70a9284e2e7d13914722bcfb35982810fd9 ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  5 March 2025                                                    *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2025                                         *
* Purpose   :  This module provides a simple interface to the Clipper Library  *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/include/clipper2/clipper.minkowski.h lines 1-8 sha256 cdae0fe0061270c6bfddb37d48b83f3282bbac2192e0db9c20ab7ce6467d53da ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  1 November 2023                                                 *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2023                                         *
* Purpose   :  Minkowski Sum and Difference                                    *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/include/clipper2/clipper.offset.h lines 1-8 sha256 72d6759ae4ebff079fc3bfe4884be044ef5eb7225f56eaf59338755aae6ca001 ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  22 January 2025                                                 *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2025                                         *
* Purpose   :  Path Offset (Inflate/Shrink)                                    *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/include/clipper2/clipper.rectclip.h lines 1-8 sha256 158c174c00fb7604fffe0c5e4985f1a3da5257cc4426ae230319f4e9cb224cb7 ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  5 July 2024                                                     *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2024                                         *
* Purpose   :  FAST rectangular clipping                                       *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/include/clipper2/clipper.triangulation.h lines 1-9 sha256 2338f4a7a6eb598df2e54efbb2132a168c2de6e8d990f0758e1f112eea950301 ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  6 December 2025                                                 *
* Release   :  BETA RELEASE                                                    *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2025                                         *
* Purpose   :  Delaunay Triangulation                                          *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/src/clipper.engine.cpp lines 1-8 sha256 8ccb3049d65daa990008e8b26cac0f0ae58cc17a9b98e32383691ecc96b5bf98 ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  5 November 2025                                                 *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2025                                         *
* Purpose   :  This is the main polygon clipping module                        *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/src/clipper.offset.cpp lines 1-8 sha256 61a5025a10a4eeeb41eebd9840550dd8e1726595676ae07f5db4ec1091450d4e ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  11 October 2025                                                 *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2025                                         *
* Purpose   :  Path Offset (Inflate/Shrink)                                    *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/src/clipper.rectclip.cpp lines 1-8 sha256 3d7e3ace5f031075056144c3b330769782f28581f04b1183316f3931d5e4a0a8 ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  11 October 2025                                                 *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2025                                         *
* Purpose   :  FAST rectangular clipping                                       *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/Clipper2/CPP/Clipper2Lib/src/clipper.triangulation.cpp lines 1-9 sha256 3abbbd3612dfa17bb8750050680d15091d6049f10c658474ce8f948ccd2880d4 ====
/*******************************************************************************
* Author    :  Angus Johnson                                                   *
* Date      :  13 December 2025                                                *
* Release   :  BETA RELEASE                                                    *
* Website   :  https://www.angusj.com                                          *
* Copyright :  Angus Johnson 2010-2025                                         *
* Purpose   :  Constrained Delaunay Triangulation                              *
* License   :  https://www.boost.org/LICENSE_1_0.txt                           *
*******************************************************************************/

==== sources/openscad/submodules/manifold/cmake/version.h.in lines 1-13 sha256 54fba1cdec7986d5bccdb2f21c82167ae7725b7efefda6a6b05519bd2f5500f1 ====
also in: sources/openscad/submodules/manifold/src/iters.h:1-13, sources/openscad/submodules/manifold/src/mesh_fixes.h:1-13, sources/openscad/submodules/manifold/src/minkowski.cpp:1-13, sources/openscad/submodules/manifold/src/subdivision.cpp:1-13, sources/openscad/submodules/manifold/src/tri_dist.h:1-13
// Copyright 2024 The Manifold Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

==== sources/openscad/submodules/manifold/include/manifold/common.h lines 1-13 sha256 d45a3a75236500b5643255d3563983add6c76a684de7c00c1033a5195c07118a ====
also in: sources/openscad/submodules/manifold/include/manifold/linalg.h:1-13, sources/openscad/submodules/manifold/include/manifold/math.h:1-13, sources/openscad/submodules/manifold/src/constructors.cpp:1-13, sources/openscad/submodules/manifold/src/execution_impl.cpp:1-13, sources/openscad/submodules/manifold/src/execution_impl.h:1-13, sources/openscad/submodules/manifold/src/polygon_internal.h:1-13
// Copyright 2026 The Manifold Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

==== sources/openscad/submodules/manifold/include/manifold/cross_section.h lines 1-13 sha256 03e77cba5c2405e3094277023e0e80713e4419156dac3522ded116e1b6ea7d14 ====
also in: sources/openscad/submodules/manifold/include/manifold/vec_view.h:1-13, sources/openscad/submodules/manifold/src/cross_section/cross_section.cpp:1-13, sources/openscad/submodules/manifold/src/sdf.cpp:1-13
// Copyright 2023 The Manifold Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

==== sources/openscad/submodules/manifold/include/manifold/cross_section.h lines 57-59 sha256 a981d252fab8a8c73d622b4cb464dbd8e15543154c09eda14d8a993c0a1eb406 ====
  // Adapted from Clipper2 docs:
  // http://www.angusj.com/clipper2/Docs/Units/Clipper/Types/FillRule.htm
  // (Copyright © 2010-2023 Angus Johnson)

==== sources/openscad/submodules/manifold/include/manifold/cross_section.h lines 74-76 sha256 911d15dc2d090638c4be966f97e2b09731633336d4dda5bd6b7013870a5cb5c6 ====
  // Adapted from Clipper2 docs:
  // http://www.angusj.com/clipper2/Docs/Units/Clipper/Types/JoinType.htm
  // (Copyright © 2010-2023 Angus Johnson)

==== sources/openscad/submodules/manifold/include/manifold/linalg.h lines 15-32 sha256 980d9b42c996932415571b7763d439e796e8448ede8f738380d41918d33d37e7 ====
// Based on linalg.h - 2.2 - Single-header public domain linear algebra library
//
// The intent of this library is to provide the bulk of the functionality
// you need to write programs that frequently use small, fixed-size vectors
// and matrices, in domains such as computational geometry or computer
// graphics. It strives for terse, readable source code.
//
// The original author of this software is Sterling Orsten, and its permanent
// home is <http://github.com/sgorsten/linalg/>. If you find this software
// useful, an acknowledgement in your source text and/or product documentation
// is appreciated, but not required.
//
// The author acknowledges significant insights and contributions by:
//     Stan Melax <http://github.com/melax/>
//     Dimitri Diakopoulos <http://github.com/ddiakopoulos/>
//
// Some features are deprecated. Define LINALG_FORWARD_COMPATIBLE to remove
// them.

==== sources/openscad/submodules/manifold/include/manifold/manifold.h lines 1-13 sha256 522220e15d549f12a8edfbd822baa6bb44b9e1e6c147d54ccd35c53429320cb8 ====
also in: sources/openscad/submodules/manifold/include/manifold/mesh.h:1-13, sources/openscad/submodules/manifold/include/manifold/polygon.h:1-13, sources/openscad/submodules/manifold/src/boolean3.cpp:1-13, sources/openscad/submodules/manifold/src/boolean_result.cpp:1-13, sources/openscad/submodules/manifold/src/collider.h:1-13, sources/openscad/submodules/manifold/src/edge_op.cpp:1-13, sources/openscad/submodules/manifold/src/face_op.cpp:1-13, sources/openscad/submodules/manifold/src/impl.cpp:1-13, sources/openscad/submodules/manifold/src/impl.h:1-13, sources/openscad/submodules/manifold/src/manifold.cpp:1-13, sources/openscad/submodules/manifold/src/polygon.cpp:1-13, sources/openscad/submodules/manifold/src/properties.cpp:1-13, sources/openscad/submodules/manifold/src/shared.h:1-13, sources/openscad/submodules/manifold/src/smoothing.cpp:1-13, sources/openscad/submodules/manifold/src/sort.cpp:1-13, sources/openscad/submodules/manifold/src/vec.h:1-13
// Copyright 2021 The Manifold Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

==== sources/openscad/submodules/manifold/include/manifold/math.h lines 15-30 sha256 e10c57e0c12cbad1b353328d2fece19a37ac726b64d684fb9b4c87230608ebf6 ====
// Deterministic trigonometric helpers.
//
// Adapted from FreeBSD msun implementations via musl libc sources:
// - https://git.musl-libc.org/cgit/musl/plain/src/math/__sin.c
// - https://git.musl-libc.org/cgit/musl/plain/src/math/__cos.c
// - https://git.musl-libc.org/cgit/musl/plain/src/math/__tan.c
// - https://git.musl-libc.org/cgit/musl/plain/src/math/__rem_pio2.c
// - https://git.musl-libc.org/cgit/musl/plain/src/math/e_acos.c
// - https://git.musl-libc.org/cgit/musl/plain/src/math/atan.c
// - https://git.musl-libc.org/cgit/musl/plain/src/math/atan2.c
// - https://git.musl-libc.org/cgit/musl/plain/src/math/tan.c
//
// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
// Developed at SunPro/SunSoft, a Sun Microsystems, Inc. business.
// Permission to use, copy, modify, and distribute this software is freely
// granted, provided that this notice is preserved.

==== sources/openscad/submodules/manifold/include/manifold/optional_assert.h lines 1-13 sha256 572983570f6a17f4c8516a7bca63fed2900433fa1be74d1e27e811015939988b ====
also in: sources/openscad/submodules/manifold/src/csg_tree.cpp:1-13, sources/openscad/submodules/manifold/src/csg_tree.h:1-13, sources/openscad/submodules/manifold/src/hashtable.h:1-13
// Copyright 2022 The Manifold Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

==== sources/openscad/submodules/manifold/src/boolean3.h lines 1-13 sha256 da28c5dee24401fc1334cf67b5a340ebc766c1dd148c41d2c8b45a47a8470869 ====
// Copyright 2020 The Manifold Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

==== sources/openscad/submodules/manifold/src/disjoint_sets.h lines 1-21 sha256 96e026523acf9bf38e4e1799de74d1b8ab3b8ddbbaf2cef2fef2708deb5f4f07 ====
// from https://github.com/wjakob/dset, changed to add connected component
// computation
//
// Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch>
//
// This software is provided 'as-is', without any express or implied
// warranty.  In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
//

==== sources/openscad/submodules/manifold/src/parallel.h lines 1-16 sha256 6cd73a4d2f710e12a660fc16d49b7c8b4673cc548b90b2c9a96fceb635120a03 ====
// Copyright 2022 The Manifold Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Simple implementation of selected functions in PSTL.
// Iterators must be RandomAccessIterator.

==== sources/openscad/submodules/manifold/src/quickhull.cpp lines 1-16 sha256 7cbe71d9eaf723e8d34b9e1c5f2199a26474075272bea80c19f79ffa0df9c65b ====
also in: sources/openscad/submodules/manifold/src/quickhull.h:1-16
// Copyright 2024 The Manifold Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Derived from the public domain work of Antti Kuukka at
// https://github.com/akuukka/quickhull

==== sources/openscad/submodules/manifold/src/quickhull.h lines 18-55 sha256 bbc884fc8f4d8f51eb9560da6fa3888978198f511dc66dab8ebf1fc868b0e3e0 ====
/*
 * INPUT:  a list of points in 3D space (for example, vertices of a 3D mesh)
 *
 * OUTPUT: a ConvexHull object which provides vertex and index buffers of the
 *generated convex hull as a triangle mesh.
 *
 *
 *
 * The implementation is thread-safe if each thread is using its own QuickHull
 *object.
 *
 *
 * SUMMARY OF THE ALGORITHM:
 *         - Create initial simplex (tetrahedron) using extreme points. We have
 *four faces now and they form a convex mesh M.
 *         - For each point, assign them to the first face for which they are on
 *the positive side of (so each point is assigned to at most one face). Points
 *inside the initial tetrahedron are left behind now and no longer affect the
 *calculations.
 *         - Add all faces that have points assigned to them to Face Stack.
 *         - Iterate until Face Stack is empty:
 *              - Pop topmost face F from the stack
 *              - From the points assigned to F, pick the point P that is
 *farthest away from the plane defined by F.
 *              - Find all faces of M that have P on their positive side. Let us
 *call these the "visible faces".
 *              - Because of the way M is constructed, these faces are
 *connected. Solve their horizon edge loop.
 *				- "Extrude to P": Create new faces by connecting
 *P with the points belonging to the horizon edge. Add the new faces to M and
 *remove the visible faces from M.
 *              - Each point that was assigned to visible faces is now assigned
 *to at most one of the newly created faces.
 *              - Those new faces that have points assigned to them are added to
 *the top of Face Stack.
 *          - M is now the convex hull.
 *
 * */

==== sources/openscad/submodules/manifold/src/smoothing.cpp lines 681-688 sha256 9f30760dac43c487ade1b8a24e4c125f8f23fa99c4f144a6e7de4a935ab15beb ====
/**
 * Redistribute the tangents around each vertex so that the angles between them
 * have the same ratios as the angles of the triangles between the corresponding
 * edges. This avoids folding the output shape and gives smoother results. There
 * must be at least one fixed halfedge on a vertex for that vertex to be
 * operated on. If there is only one, then that halfedge is not treated as
 * fixed, but the whole circle is turned to an average orientation.
 */

==== sources/openscad/submodules/manifold/src/svd.h lines 1-1 sha256 2d18d659dfe91c026fe765dcf749f5ff0738097623318b766471e87e0d853178 ====
// MIT License

==== sources/openscad/submodules/manifold/src/svd.h lines 3-4 sha256 3b3ba04f8ea6b72f433d4a545cb37997f94787e8671bf2f8b1cb31fafa1c9013 ====
// Copyright (c) 2019 wi-re
// Copyright 2023 The Manifold Authors.

==== sources/openscad/submodules/manifold/src/svd.h lines 6-11 sha256 c22ad0806e4217b298230f479e22005be93a73510b7560a090ae007bf10b1260 ====
// 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:

==== sources/openscad/submodules/manifold/src/svd.h lines 13-14 sha256 30d76e5237d1665af33cca2ccd5db979f4805ec828d12b22c03a9e3e5be35153 ====
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.

==== sources/openscad/submodules/manifold/src/svd.h lines 16-22 sha256 fc829d09fda472fae620b79bb77658f4604ec38608659651c86b12d3d8f2434b ====
// 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.

==== sources/openscad/submodules/manifold/src/svd.h lines 24-25 sha256 d840c052f8d5279c6238e3c932fb9292264be63c079b87b64bed7fdf5dde0af0 ====
// Modified from https://github.com/wi-re/tbtSVD, removing CUDA dependence and
// approximate inverse square roots.

==== sources/openscad/submodules/manifold/src/tree2d.cpp lines 1-13 sha256 d6e4349279791fbc4e63f189e168ef2f47bf9f0873d4999146c6b2d12d371acf ====
also in: sources/openscad/submodules/manifold/src/tree2d.h:1-13
// Copyright 2025 The Manifold Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

==== sources/openscad/submodules/manifold/src/tri_dist.h lines 24-27 sha256 cc3b732b10a8ee13c8df827158bd89b55ac5fb18b32efb5c5b1e35602fd985d9 ====
// From NVIDIA-Omniverse PhysX - BSD 3-Clause "New" or "Revised" License
// https://github.com/NVIDIA-Omniverse/PhysX/blob/main/LICENSE.md
// https://github.com/NVIDIA-Omniverse/PhysX/blob/main/physx/source/geomutils/src/sweep/GuSweepCapsuleCapsule.cpp
// With minor modifications

==== sources/openscad/submodules/manifold/src/tri_dist.h lines 85-88 sha256 4fe750c238557ba4b1576bcca0ff86df5b3ed4e9df3f404d65d69492e6445c29 ====
// From NVIDIA-Omniverse PhysX - BSD 3-Clause "New" or "Revised" License
// https://github.com/NVIDIA-Omniverse/PhysX/blob/main/LICENSE.md
// https://github.com/NVIDIA-Omniverse/PhysX/blob/main/physx/source/geomutils/src/distance/GuDistanceTriangleTriangle.cpp
// With minor modifications

==== sources/openscad/submodules/manifold/src/utils.h lines 1-14 sha256 49c190104656f213f0969010faf6a87f25e0bdc3cbcbdd085531d0d6ae4e62c3 ====
// Copyright 2020 The Manifold Authors, Jared Hoberock and Nathan Bell of
// NVIDIA Research
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

