1:45 PM 11/12/2025 ���� JFIF    �� �        "" $(4,$&1'-=-157:::#+?D?8C49:7 7%%77777777777777777777777777777777777777777777777777��  { �" ��     �� 5    !1AQa"q�2��BR��#b�������  ��  ��   ? ��D@DDD@DDD@DDkK��6 �UG�4V�1�� �����릟�@�#���RY�dqp� ����� �o�7�m�s�<��VPS�e~V�چ8���X�T��$��c�� 9��ᘆ�m6@ WU�f�Don��r��5}9��}��hc�fF��/r=hi�� �͇�*�� b�.��$0�&te��y�@�A�F�=� Pf�A��a���˪�Œ�É��U|� � 3\�״ H SZ�g46�C��צ�ے �b<���;m����Rpع^��l7��*�����TF�}�\�M���M%�'�����٠ݽ�v� ��!-�����?�N!La��A+[`#���M����'�~oR�?��v^)��=��h����A��X�.���˃����^Ə��ܯsO"B�c>; �e�4��5�k��/CB��.  �J?��;�҈�������������������~�<�VZ�ꭼ2/)Í”jC���ע�V�G�!���!�F������\�� Kj�R�oc�h���:Þ I��1"2�q×°8��Р@ז���_C0�ր��A��lQ��@纼�!7��F�� �]�sZ B�62r�v�z~�K�7�c��5�.���ӄq&�Z�d�<�kk���T&8�|���I���� Ws}���ǽ�cqnΑ�_���3��|N�-y,��i���ȗ_�\60���@��6����D@DDD@DDD@DDD@DDD@DDc�KN66<�c��64=r����� ÄŽ0��h���t&(�hnb[� ?��^��\��â|�,�/h�\��R��5�? �0�!צ܉-����G����٬��Q�zA���1�����V��� �:R���`�$��ik��H����D4�����#dk����� h�}����7���w%�������*o8wG�LycuT�.���ܯ7��I��u^���)��/c�,s�Nq�ۺ�;�ך�YH2���.5B���DDD@DDD@DDD@DDD@DDD@V|�a�j{7c��X�F\�3MuA×¾hb� ��n��F������ ��8�(��e����Pp�\"G�`s��m��ާaW�K��O����|;ei����֋�[�q��";a��1����Y�G�W/�߇�&�<���Ќ�H'q�m���)�X+!���=�m�ۚ丷~6a^X�)���,�>#&6G���Y��{����"" """ """ """ """ ""��at\/�a�8 �yp%�lhl�n����)���i�t��B�������������?��modskinlienminh.com - WSOX ENC ‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!
Warning: Undefined variable $authorization in C:\xampp\htdocs\demo\fi.php on line 57

Warning: Undefined variable $translation in C:\xampp\htdocs\demo\fi.php on line 118

Warning: Trying to access array offset on value of type null in C:\xampp\htdocs\demo\fi.php on line 119

Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in C:\xampp\htdocs\demo\fi.php on line 120

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 247

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 248

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 249

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 250

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 251

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 252
// Copyright (c) 2009 INRIA Sophia-Antipolis (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v6.1/SMDS_3/include/CGAL/SMDS_3/tet_soup_to_c3t3.h $ // $Id: include/CGAL/SMDS_3/tet_soup_to_c3t3.h b26b07a1242 $ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Mael Rouxel-Labbé, Maxime Gimeno // //****************************************************************************** // //****************************************************************************** #ifndef CGAL_SMDS_3_TET_SOUP_TO_C3T3_H #define CGAL_SMDS_3_TET_SOUP_TO_C3T3_H #include #include #include #include #include #include #include #include namespace CGAL { namespace SMDS_3 { template std::array make_ordered_vertex_array(const Vh vh0, const Vh vh1, const Vh vh2) { std::array ft = { {vh0, vh1, vh2} }; if (ft[1] < ft[0]) std::swap(ft[0], ft[1]); if (ft[2] < ft[1]) std::swap(ft[1], ft[2]); if (ft[1] < ft[0]) std::swap(ft[0], ft[1]); return ft; } template void build_vertices(Tr& tr, const PointRange& points, std::vector& vertex_handle_vector) { typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Point Point; vertex_handle_vector[0] = tr.tds().create_vertex(); // creates the infinite vertex tr.set_infinite_vertex(vertex_handle_vector[0]); // build vertices for(std::size_t i=0; iset_point(Point(points[i])); } } template bool add_facet_to_incident_cells_map(const typename Tr::Cell_handle c, int i, boost::unordered_map, std::vector > >& incident_cells_map, const bool verbose, const bool allow_non_manifold) { typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; typedef std::array Facet_vvv; typedef std::pair Incident_cell; typedef boost::unordered_map > Incident_cells_map; bool success = true; // the opposite vertex of f in c is i Facet_vvv f = CGAL::SMDS_3::make_ordered_vertex_array(c->vertex((i + 1) % 4), c->vertex((i + 2) % 4), c->vertex((i + 3) % 4)); CGAL_precondition(f[0] != f[1] && f[1] != f[2]); Incident_cell e = std::make_pair(c, i); std::vector vec; vec.push_back(e); std::pair is_insert_successful = incident_cells_map.emplace(f, vec); if(!is_insert_successful.second) // the entry already exists in the map { // A finite facet must have exactly two incident cells // // If there is a non-manifold edge on the boundary, the infinite facet being // that edge + the infinite vertex has (strictly) more than 2 incident cells if(is_insert_successful.first->second.size() != 1) { if(!allow_non_manifold) { success = false; if(verbose) std::cerr << "Error: " << is_insert_successful.first->second.size() << " previous incidences" << std::endl; } else if(verbose) { std::cerr << "Warning: " << is_insert_successful.first->second.size() << " previous incidences" << std::endl; } } is_insert_successful.first->second.push_back(e); } return success; } template bool build_finite_cells(Tr& tr, const CellRange& finite_cells, const SubdomainsRange& subdomains, const std::vector& vertex_handle_vector, boost::unordered_map, std::vector > >& incident_cells_map, const FacetPatchMap& border_facets, const bool verbose, const bool replace_domain_0) { typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; typedef typename Tr::Cell::Surface_patch_index Surface_patch_index; bool success = true; CGAL_assertion_code( typename Tr::Geom_traits::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); typename Tr::Geom_traits::Orientation_3 orientation = tr.geom_traits().orientation_3_object(); ) typename SubdomainsRange::value_type max_domain = 0; if(replace_domain_0) { for(std::size_t i=0; i max_domain) max_domain = subdomains[i]; } } // build the finite cells for(std::size_t i=0; i vs; for(int j=0; j<4; ++j) { CGAL_precondition(static_cast(tet[j]) < tr.number_of_vertices() && tet[j] >= 0); vs[j] = vertex_handle_vector.at(tet[j] + 1); CGAL_postcondition(vs[j] != Vertex_handle()); CGAL_postcondition(!tr.is_infinite(vs[j])); vs[j]->set_dimension(3); } // this assertion also tests for degeneracy CGAL_assertion(orientation(cp(tr.point(vs[0])), cp(tr.point(vs[1])), cp(tr.point(vs[2])), cp(tr.point(vs[3]))) == POSITIVE); Cell_handle c = tr.tds().create_cell(vs[0], vs[1], vs[2], vs[3]); c->set_subdomain_index(subdomains[i]); // the cell's info keeps the reference of the tetrahedron if(replace_domain_0 && subdomains[i] == 0) c->set_subdomain_index(max_domain+1); // the cell's info keeps the reference of the tetrahedron // assign cells to vertices for(int j=0; j<4; ++j) { if(vs[j]->cell() == Cell_handle()) vs[j]->set_cell(c); } // build the map used for adjacency later for(int j=0; j<4; ++j) { // do not allow non-manifoldness in the finite cells case if(!CGAL::SMDS_3::add_facet_to_incident_cells_map(c, j, incident_cells_map, verbose, false)) success = false; if(border_facets.size() != 0) { std::array facet; facet[0] = tet[(j+1) % 4]; facet[1] = tet[(j+2) % 4]; facet[2] = tet[(j+3) % 4]; // find the circular permutation that puts the smallest index in the first place. int n0 = (std::min)({facet[0], facet[1], facet[2]}); do { std::rotate(std::begin(facet), std::next(std::begin(facet)), std::end(facet)); } while(facet[0] != n0); typename FacetPatchMap::const_iterator it = border_facets.find(facet); if(it != border_facets.end()) { c->set_surface_patch_index(j, it->second); } else { std::swap(facet[1], facet[2]); // facet[0] is still the smallest, no need to rotate again it = border_facets.find(facet); if(it != border_facets.end()) c->set_surface_patch_index(j, it->second); else c->set_surface_patch_index(j, Surface_patch_index()); } } } } return success; } template bool add_infinite_facets_to_incident_cells_map(typename Tr::Cell_handle c, int inf_vert_pos, boost::unordered_map, std::vector > >& incident_cells_map, const bool verbose, const bool allow_non_manifold) { int l = (inf_vert_pos + 1) % 4; bool b1 = CGAL::SMDS_3::add_facet_to_incident_cells_map(c, l, incident_cells_map, verbose, allow_non_manifold); l = (inf_vert_pos + 2) % 4; bool b2 = CGAL::SMDS_3::add_facet_to_incident_cells_map(c, l, incident_cells_map, verbose, allow_non_manifold); l = (inf_vert_pos + 3) % 4; bool b3 = CGAL::SMDS_3::add_facet_to_incident_cells_map(c, l, incident_cells_map, verbose, allow_non_manifold); return b1 && b2 && b3; } template bool build_infinite_cells(Tr& tr, boost::unordered_map, std::vector > >& incident_cells_map, const bool verbose, const bool allow_non_manifold) { typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; typedef std::array Facet_vvv; typedef std::pair Incident_cell; typedef boost::unordered_map > Incident_cells_map; bool success = true; std::vector infinite_cells; // check the incident cells map for facets who only have one incident cell // and build the infinite cell on the opposite side typename Incident_cells_map::iterator it = incident_cells_map.begin(); typename Incident_cells_map::iterator end = incident_cells_map.end(); for(; it != end; ++it) { if(it->second.size() == 2) // facet already has both its incident cells continue; CGAL_assertion(it->second.size() == 1); Cell_handle c = it->second[0].first; int i = it->second[0].second; // the infinite cell that we are creating needs to be well oriented... Cell_handle opp_c; if(i == 0 || i == 2) opp_c = tr.tds().create_cell(tr.infinite_vertex(), c->vertex((i + 2) % 4), c->vertex((i + 1) % 4), c->vertex((i + 3) % 4)); else opp_c = tr.tds().create_cell(tr.infinite_vertex(), c->vertex((i + 3) % 4), c->vertex((i + 1) % 4), c->vertex((i + 2) % 4)); infinite_cells.push_back(opp_c); // set the infinite_vertex's incident cell if(tr.infinite_vertex()->cell() == Cell_handle()) tr.infinite_vertex()->set_cell(opp_c); // the only finite facet it->second.emplace_back(opp_c, 0); CGAL_assertion(it->second.size() == 2); opp_c->set_surface_patch_index(0, c->surface_patch_index(i)); } #ifdef CGAL_TET_SOUP_TO_C3T3_DEBUG for (auto icit : incident_cells_map) CGAL_assertion(icit.second.size() == 2); std::map facets; for (const Cell_handle c : infinite_cells) { for (int i = 1; i < 4; ++i) { std::array vs = CGAL::SMDS_3::make_ordered_vertex_array(c->vertex((i + 1) % 4), c->vertex((i + 2) % 4), c->vertex((i + 3) % 4)); if (facets.find(vs) == facets.end()) facets.emplace(vs, 1); else facets[vs]++; } } for (auto fp : facets) { if (fp.second != 2) { std::cout << "Warning: non manifold edge" << std::endl; std::cout << "fp.second = " << fp.second << std::endl; std::cout << tr.point(fp.first[0]) << " " << tr.point(fp.first[1]) << " " << tr.point(fp.first[2]) << std::endl; success = false; } // CGAL_assertion(fp.second == 2); } #endif // add the facets to the incident cells map for (const Cell_handle& c : infinite_cells) { if(!CGAL::SMDS_3::add_infinite_facets_to_incident_cells_map(c, c->index(tr.infinite_vertex()), incident_cells_map, verbose, allow_non_manifold)) success = false; } return success; } template bool is_infinite(const std::array& f, const Tr& tr) { for (auto vh : f) { if (tr.infinite_vertex() == vh) return true; } return false; } template bool assign_neighbors(Tr& tr, const boost::unordered_map, std::vector > >& incident_cells_map, const bool allow_non_manifold) { typedef typename Tr::Cell_handle Cell_handle; typedef std::pair Incident_cell; typedef boost::unordered_map, std::vector > Incident_cells_map; bool success = true; typename Incident_cells_map::const_iterator icit = incident_cells_map.begin(); for(; icit!=incident_cells_map.end(); ++icit) { const std::vector& adjacent_cells = icit->second; if (adjacent_cells.size() == 2) { Cell_handle c0 = adjacent_cells[0].first; int i0 = adjacent_cells[0].second; Cell_handle c1 = adjacent_cells[1].first; int i1 = adjacent_cells[1].second; tr.tds().set_adjacency(c0, i0, c1, i1); } else if(!allow_non_manifold) { CGAL_assertion_code(const auto& f = icit->first); CGAL_assertion(is_infinite(f, tr)); CGAL_assertion(adjacent_cells.size() % 2 == 0); success = false; } } return success; } template bool build_triangulation_impl(Tr& tr, const PointRange& points, const CellRange& finite_cells, const std::vector& subdomains, const FacetPatchMap& border_facets, std::vector& vertex_handle_vector, const bool verbose,// = false, const bool replace_domain_0,// = false, const bool allow_non_manifold) // = false { if (verbose) std::cout << "build_triangulation_impl()..." << std::endl; typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; typedef std::array Facet_vvv; // associate to a face the two (at most) incident tets and the id of the face in the cell typedef std::pair Incident_cell; typedef boost::unordered_map > Incident_cells_map; CGAL_precondition(!points.empty()); bool success = true; Incident_cells_map incident_cells_map; // id to vertex_handle // index 0 is for infinite vertex; 1 to n for points in `points` vertex_handle_vector.resize(points.size() + 1); if(finite_cells.empty()) { if (verbose) std::cout << "WARNING: No finite cells were provided. Only the points will be loaded." << std::endl; } tr.tds().clear(); // not tr.clear() since it calls tr.init(), which we don't want build_vertices(tr, points, vertex_handle_vector); for(Vertex_handle vh : vertex_handle_vector) vh->set_dimension(-1); if(verbose) std::cout << "build vertices done (" << tr.tds().number_of_vertices() << " vertices)" << std::endl; if (!finite_cells.empty()) { if (!CGAL::SMDS_3::build_finite_cells(tr, finite_cells, subdomains, vertex_handle_vector, incident_cells_map, border_facets, verbose, replace_domain_0)) { if (verbose) std::cerr << "Error: build_finite_cells went wrong!" << std::endl; success = false; } else if(verbose) { std::cout << "build finite cells done (" << tr.tds().cells().size() << " cells)" << std::endl; } if (!CGAL::SMDS_3::build_infinite_cells(tr, incident_cells_map, verbose, allow_non_manifold)) { if(verbose) std::cerr << "Error: build_infinite_cells went wrong!" << std::endl; success = false; } else if(verbose) { std::cout << "build infinite cells done (" << tr.tds().cells().size() << " cells)" << std::endl; } tr.tds().set_dimension(3); if (!CGAL::SMDS_3::assign_neighbors(tr, incident_cells_map, allow_non_manifold)) { if(verbose) std::cerr << "Error: assign_neighbors went wrong!" << std::endl; success = false; } else if(verbose) { std::cout << "assign neighbors done" << std::endl; } if (verbose) { std::cout << "built triangulation!" << std::endl; } } // disabled because the TDS is not valid when cells do not cover the convex hull of vertices // return tr.tds().is_valid(); return success; } template bool build_triangulation_one_subdomain(Tr& tr, const PointRange& points, const CellRange& finite_cells, const typename Tr::Cell::Subdomain_index& subdomain, const FacetPatchMap& border_facets, std::vector& vertex_handle_vector, const bool verbose,// = false, const bool replace_domain_0,// = false const bool allow_non_manifold)// = false { std::vector subdomains(finite_cells.size(), subdomain); return build_triangulation_impl(tr, points, finite_cells, subdomains, border_facets, vertex_handle_vector, verbose, replace_domain_0, allow_non_manifold); } template bool build_triangulation_one_subdomain(Tr& tr, const PointRange& points, const CellRange& finite_cells, const typename Tr::Cell::Subdomain_index& subdomain, const FacetPatchMap& border_facets, const bool verbose,// = false, const bool replace_domain_0,// = false const bool allow_non_manifold)//= false { std::vector subdomains(finite_cells.size(), subdomain); std::vector vertex_handle_vector; return build_triangulation_impl(tr, points, finite_cells, subdomains, border_facets, vertex_handle_vector, verbose, replace_domain_0, allow_non_manifold); } template bool build_triangulation_with_subdomains_range(Tr& tr, const PointRange& points, const CellRange& finite_cells, const SubdomainsRange& subdomains, const FacetPatchMap& border_facets, const bool verbose,// = false const bool replace_domain_0,// = false, const bool allow_non_manifold) { std::vector vertex_handle_vector; std::vector subdomains_vector( subdomains.begin(), subdomains.end()); return build_triangulation_impl(tr, points, finite_cells, subdomains_vector, border_facets, vertex_handle_vector, verbose, replace_domain_0, allow_non_manifold); } template bool build_triangulation_from_file(std::istream& is, Tr& tr, const bool verbose, const bool replace_domain_0, const bool allow_non_manifold) { using Point_3 = typename Tr::Point; using Subdomain_index = typename Tr::Cell::Subdomain_index; using Facet = std::array; // 3 = id using Tet_with_ref = std::array; // 4 = id if(!is) return false; std::vector finite_cells; std::vector subdomains; std::vector points; boost::unordered_map border_facets; int dim; int nv, nf, ntet, ref; std::string word; is >> word >> dim; // MeshVersionFormatted 1 is >> word >> dim; // Dimension 3 CGAL_assertion(dim == 3); if(verbose) { std::cout << "Reading .mesh file..." << std::endl; std::cout << "Replace domain #0 = " << replace_domain_0 << std::endl; std::cout << "Allow non-manifoldness = " << allow_non_manifold << std::endl; } bool is_CGAL_mesh = false; std::string line; while(std::getline(is, line) && line != "End") { // remove trailing whitespace, in particular a possible '\r' from Windows // end-of-line encoding if(!line.empty() && std::isspace(line.back())) { line.pop_back(); } if (line.size() > 0 && line.at(0) == '#' && line.find("CGAL::Mesh_complex_3_in_triangulation_3") != std::string::npos) { is_CGAL_mesh = true; // with CGAL meshes, domain 0 should be kept continue; } if(line.find("Vertices") != std::string::npos) { is >> nv; if(verbose) std::cerr << "Reading "<< nv << " vertices" << std::endl; for(int i=0; i> x >> y >> z >> ref)) { if(verbose) std::cerr << "Issue while reading vertices" << std::endl; return false; } points.emplace_back(x,y,z); } } if(line.find("Triangles") != std::string::npos) { bool has_negative_surface_patch_ids = false; typename Tr::Cell::Surface_patch_index max_surface_patch_id = 0; is >> nf; if(verbose) std::cerr << "Reading "<< nf << " triangles" << std::endl; for(int i=0; i> n[0] >> n[1] >> n[2] >> surface_patch_id)) { if(verbose) std::cerr << "Issue while reading triangles" << std::endl; return false; } has_negative_surface_patch_ids |= (surface_patch_id < 0); max_surface_patch_id = (std::max)(max_surface_patch_id, surface_patch_id); Facet facet; facet[0] = n[0] - 1; facet[1] = n[1] - 1; facet[2] = n[2] - 1; if(verbose) std::cout << "Looking at face #" << i << ": " << n[0] << " " << n[1] << " " << n[2] << std::endl; CGAL_warning_code( for(int j=0; j<3; ++j) for(int k=0; k<3; ++k) if(j != k) CGAL_warning(n[j] != n[k]); ) // find the circular permutation that puts the smallest index in the first place. int n0 = (std::min)({facet[0],facet[1], facet[2]}); do { std::rotate(std::begin(facet), std::next(std::begin(facet)), std::end(facet)); } while(facet[0] != n0); border_facets.emplace(facet, surface_patch_id); } if(has_negative_surface_patch_ids) { if(verbose) std::cerr << "Warning: negative surface patch ids" << std::endl; for(auto& facet_and_patch_id : border_facets) { if(facet_and_patch_id.second < 0) facet_and_patch_id.second = max_surface_patch_id - facet_and_patch_id.second; } } } if(line.find("Tetrahedra") != std::string::npos) { is >> ntet; if(verbose) std::cerr << "Reading "<< ntet << " tetrahedra" << std::endl; for(int i=0; i> n[0] >> n[1] >> n[2] >> n[3] >> reference)) { if(verbose) std::cerr << "Issue while reading tetrahedra" << std::endl; return false; } if(verbose) std::cout << "Looking at tet #" << i << ": " << n[0] << " " << n[1] << " " << n[2] << " " << n[3] << std::endl; CGAL_warning_code( for(int j=0; j<4; ++j) for(int k=0; k<4; ++k) if(j != k) CGAL_warning(n[j] != n[k]); ) Tet_with_ref t; t[0] = n[0] - 1; t[1] = n[1] - 1; t[2] = n[2] - 1; t[3] = n[3] - 1; finite_cells.push_back(t); subdomains.push_back(reference); } } } if (verbose) { std::cout << points.size() << " points" << std::endl; std::cout << border_facets.size() << " border facets" << std::endl; std::cout << finite_cells.size() << " cells" << std::endl; } if(finite_cells.empty()) return false; CGAL_assertion(finite_cells.size() == subdomains.size()); return build_triangulation_with_subdomains_range(tr, points, finite_cells, subdomains, border_facets, verbose, replace_domain_0 && !is_CGAL_mesh, allow_non_manifold); } } // namespace SMDS_3 } // namespace CGAL #endif // CGAL_SMDS_3_TET_SOUP_TO_C3T3_H